我读过其他类似的问题,唉,我还是很困惑。
这是我当前的生成文件:
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/