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

C++ 如何使用单个makefile编译不同目录中的多个.cpp文件?,c++,makefile,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/cont

我的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

有人能帮我吗?谢谢你

我强烈建议你开始学习
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)

我强烈建议您开始学习
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)

这是我的
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
文件夹包含名为
main.exe
.exe
文件。您可以这样更改或删除它

run: 
   ./main
我希望它能起作用


@加利克有权利。如果你想学习
C++
,你一定要学习
make

这是我的
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
文件夹包含名为
main.exe
.exe
文件。您可以这样更改或删除它

run: 
   ./main
我希望它能起作用


@加利克有权利。如果你想学习
C++
,你一定要学习
make

你需要阅读一本基本的Unix命令行终端教程。您认为路径中的前导
/
是什么意思?只有知道如何在没有Make的情况下构建它,才能使用Make构建它。您需要阅读基本的Unix命令行终端教程。你认为路径中的前导
/
是什么意思?除非你知道如何在没有Make的情况下构建它,否则你无法使用Make构建它。