我可以编译所有.cpp文件在src / to .o的obj /中,然后链接到二进制文件./?
我的项目目录如下所示:
/project Makefile main /src main.cpp foo.cpp foo.h bar.cpp bar.h /obj main.o foo.o bar.o
我想让我的makefile做的是将/src
文件夹中的所有.cpp
文件编译为/obj
文件夹中的.o
文件,然后将/obj
所有.o
文件链接到顶层的输出二进制文件文件夹/project
。
我几乎没有使用Makefiles的经验,而且我不太确定要做什么。
另外,这是一个“好”的方式来做到这一点,或者是有一个更标准的方法来做我想做的?
Makefile是问题的一部分
这很容易,除非你不需要像下面的代码一样尝试一些东西(但是用g ++附近的标签replace空格缩进)
SRC_DIR := .../src OBJ_DIR := .../obj SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp) OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) LDFLAGS := ... CPPFLAGS := ... CXXFLAGS := ... main.exe: $(OBJ_FILES) g++ $(LDFLAGS) -o $@ $^ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
自动依赖图生成
大多数制造系统的“必须”function。 使用GCC in可以通过向CXXFLAGS
添加-MMD
标志和在Makefile主体的末尾添加-include $(OBJ_FILES:.o=.d)
来完成一次编译的-MMD
:
CXXFLAGS += -MMD -include $(OBJ_FILES:.o=.d)
正如大家已经提到的那样, GNU Make Manual总是有帮助的。
通配符也适用于我,但我想给那些使用目录variables的人留下一个便笺。 总是使用斜杠文件夹树(不反斜杠),否则将失败:
BASEDIR = ../.. SRCDIR = $(BASEDIR)/src INSTALLDIR = $(BASEDIR)/lib MODULES = $(wildcard $(SRCDIR)/*.cpp) OBJS = $(wildcard *.o)