如何使用Makefiles编译包含多个目录的c ++项目?

时间:2017-04-05 08:07:42

标签: c++ linux

我已经阅读了其他类似问题的问题,唉,我仍然很困惑。

这是我目前的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指南来生成文件语法?

2 个答案:

答案 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个级别),编译器会很高兴。