我读过其他类似的问题,唉,我还是很困惑。
这是我当前的生成文件:

CC = g++

EXEFILE = template

IFLAGS= -I/usr/include/freetype2 -I../Camera
LFLAGS= -L/usr/lib/nvidia-375 -L/usr/local/lib -L/usr/include/GL -L/usr/local/include/freetype2 -L/usr/local/lib/
LIBS = -lglfw -lGL -lGLU -lOpenGL -lGLEW -pthread -lfreetype

SRC=*.cpp
DEPS=*.h

$(EXEFILE):
    $(CC) -std=c++11 -o $(EXEFILE) -Wall -Wno-comment $(SRC) $(IFLAGS) $(LFLAGS) $(LIBS)

all: run clean

run: $(EXEFILE)
    ./$(EXEFILE)
clean:
    rm $(EXEFILE)

现在我所有的.h文件和.cpp文件都在工作目录中,所有的编译和运行都很好。我的问题是,我已经有大量的文件,它变得相当混乱。我想创建多个目录(甚至这些目录中的目录)来组织我的文件。但只要我将头文件和对应的cpp文件移动到当前目录中的目录,编译器就不知道如何链接它们了。
如何告诉make文件编译并链接当前根目录下的所有内容?
或者,是否有一个关于makefile语法的eli5指南?

最佳答案

解决问题的最快方法是添加src和deps文件,这些文件包含在所有子目录中,例如:

 SRC=*.cpp src/*.cpp
 DEPS=*.h inc/*.h

现在您可以考虑编写一个规则,首先编译单独目录中的每个文件:
# Group compilation option
CXXFLAGS := -std=c++11 -Wall -Wno-comment $(IFLAGS)

# A directory to store object files (.o)
ODIR := ./objects

# Read this ugly line from the end:
#  - grep all the .cpp files in SRC with wildcard
#  - add the prefix $(ODIR) to all the file names with addprefix
#  - replace .cpp in .o with patsubst
OBJS := $(patsubst %.cpp,%.o,$(addprefix $(ODIR)/,$(wildcard $(SRC)/*.cpp)))

# Compile all the files in object files
# $@ refers to the rule name, here $(ODIR)/the_current_file.o
# $< refers to first prerequisite, here $(SRC)/the_current_file.cpp
$(ODIR)/%.o:$(SRC)/%.cpp $(DEPS)/%.h
    $(CXX) $(CXXFLAGS) -c -o $@ $<

# Finally link everything in the executable
# $^ refers to ALL the prerequisites
$(EXEFILE): $(OBJS)
    $(CXX) $(CXXFLAGS) -o $@  $^ $(LFLAGS) $(LIBS)

关于c++ - 如何使用Makefiles编译具有多个目录的C++项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43225401/

10-17 00:32