我可以编译所有.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)