我已经阅读了其他类似问题的问题,唉,我仍然很困惑。
这是我目前的Makefile:
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文件编译并链接当前根目录下的所有内容?
或者,是否有一个ELI5指南来生成文件语法?
答案 0 :(得分:0)
解决问题的最快方法是在所有子目录中添加文件包含的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)
答案 1 :(得分:0)
我找到了一个解决方案,根据我的喜好看起来很优雅,或者至少使用通配符操作符很容易追踪。这是我当前的makefile:
yshift
所以我得到所有目录深度为10.然后我取出当前的根目录(./)和任何隐藏的目录(./。),留下我在“DIRECTORIES”下存储的标准子目录,然后我添加-I到每个目录使其成为一个包含目录并将它们存储在LOCAL_I_DIRS中 所以我现在可以根据需要创建尽可能多的子目录(最多10个级别),编译器会很高兴。