如何使用makefile在不同的目录中编译多个.cpp文件?

时间:2016-10-17 14:11:16

标签: c++ makefile

我的proj2目录中有以下文件,需要将它们编译在一起才能生成一个可执行文件。

    proj2/main.cpp
    proj2/model/Player.cpp
    proj2/model/gameBoard.cpp
    proj2/controller/TTTController.cpp
    proj2/Makefile

我在makefile中使用了以下命令,但它无效。

all:
    g++ /project2_p1/main.cpp /project2_p1/controller/TTTController.cpp          /model/gameBoard.cpp /model/Player.cpp -o ttt
clean:
    -rm ttt

请有人帮帮我。谢谢你

2 个答案:

答案 0 :(得分:0)

我强烈建议您开始学习make,因为它是程序员使用的基本工具之一。而且,如果您可以学习C++,那么您肯定可以学习make

在您的项目中,您将源文件隐藏在它们自己的子目录中,因此为了找到它们,您可以使用$(shell find...)命令。与项目中的任何头文件相同。

通过使all: 直接目标无条件执行,您将失去使用make的好处 - 只有在您更改内容时才会编译。

说过我在这里提供的基本模板可以改进,只重新编译那些已经改变的源文件,但这是读者的练习。

我认为这应该适合你的情况:

# set non-optional compiler flags here
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic-errors

# set non-optional preprocessor flags here
# eg. project specific include directories
CPPFLAGS += 

# find cpp files in subdirectories
SOURCES := $(shell find . -name '*.cpp')

# find headers
HEADERS := $(shell find . -name '*.h')

OUTPUT := ttt

# Everything depends on the output
all: $(OUTPUT)

# The output depends on sources and headers
$(OUTPUT): $(SOURCES) $(HEADERS)
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(OUTPUT) $(SOURCES)

clean:
    $(RM) $(OUTPUT)

答案 1 :(得分:0)

那是我的minGW项目的makefile代码:

hepsi: derle calistir
Nesneler :=  ./lib/Hata.o ./lib/Hatalar.o ./lib/Dugum.o ./lib/ListeGezici.o ./lib/BagilListe.o

    derle:
        g++ -I ./include/ -o ./lib/Hata.o -c ./src/Hata.cpp
        g++ -I ./include/ -o ./lib/Hatalar.o -c ./src/Hatalar.cpp
        g++ -I ./include/ -o ./lib/Dugum.o -c ./src/Dugum.cpp
        g++ -I ./include/ -o ./lib/ListeGezici.o -c ./src/ListeGezici.cpp
        g++ -I ./include/ -o ./lib/BagilListe.o -c ./src/BagilListe.cpp
        g++ -I ./include/ -o ./bin/test $(Nesneler) ./src/test.cpp

    calistir:
        ./bin/test

在你的项目中,我认为这样可行;

    all: compile run
Objects :=  ./lib/Player.o ./lib/gameBoard.o ./lib/TTTController.o 

compile:
    g++ -I ./include/ -o ./lib/Player.o -c ./model/Player.cpp
    g++ -I ./include/ -o ./lib/gameBoard.o -c ./model/gameBoard.cpp
    g++ -I ./include/ -o ./lib/TTTController.o -c .controller/TTTController.cpp
    g++ -I ./include/ -o ./bin/main $(Objects) ./main.cpp

run:
    ./bin/main

lib文件夹包含.o文件。如果你愿意,你可以冒险。 include文件夹引用您的标头.h.hpp文件。您可以根据标题位置更改每一个。

bin文件夹包含名为.exe的{​​{1}}文件。您可以像这样更改或删除

main.exe

我希望它能奏效。

@Galik有权利。如果你想学习run: ./main ,你一定要学习C++