我可以在obj /中将src /中的所有.cpp文件编译为.o,然后在./中链接到二进制文件。

时间:2010-05-25 19:57:11

标签: c++ build-process makefile

我的项目目录如下所示:

/project
    Makefile
    main
    /src
        main.cpp
        foo.cpp
        foo.h
        bar.cpp
        bar.h
    /obj
        main.o
        foo.o
        bar.o

我希望makefile做的是将.cpp文件夹中的所有/src文件编译到.o文件夹中的/obj文件,然后链接所有文件.o中的/obj个文件放入顶级文件夹/project的输出二进制文件中。

我接下来没有Makefiles的经验,我不确定要搜索什么来实现这一目标。

此外,这是一种“好”的方式,或者是否有更标准的方法来实现我的目标?

2 个答案:

答案 0 :(得分:171)

Makefile是问题的一部分

这很简单,除非你不需要概括 尝试类似下面的代码(但用g ++附近的标签替换空格缩进)

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 $@ $<

自动生成依赖关系图

大多数制作系统的“必须”功能。通过将-MMD标志添加到CXXFLAGS -include $(OBJ_FILES:.o=.d) 到makefile主体的末尾,可以在单个过程中完成GCC作为编译的副作用:

CXXFLAGS += -MMD
-include $(OBJ_FILES:.o=.d)

正如大家提到的那样,总是有GNU Make Manual,这非常有帮助。

答案 1 :(得分:4)

Wildcard也适用于我,但我想为使用目录变量的人提供旁注。始终对文件夹树使用斜杠(不是反斜杠),否则将失败:

BASEDIR = ../..
SRCDIR = $(BASEDIR)/src
INSTALLDIR = $(BASEDIR)/lib

MODULES = $(wildcard $(SRCDIR)/*.cpp)
OBJS = $(wildcard *.o)