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


116

我的项目目录如下所示:

/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

我几乎没有使用Makefile的经验,也不确定要搜索什么来完成此操作。

另外,这是执行此操作的“好方法”,还是我要尝试执行的更标准的方法?



6
@aaa:我猜想OP需要一个不需要显式列出每个源文件的解决方案。
卡斯卡贝尔

7
我不想指定我拥有的每个源文件,并且我曾经尝试阅读过该手册,但是我发现它杂乱无章且难以理解。我从一个实际的示例中学到了很多东西,该示例可以完成我所期望的并且得到了很好的解释,而不是枯燥的技术手册。
奥斯丁·海德

好的。但是make文档是很好的例子,而且很好(没有尝试使用技术手册)。您正在寻找模式规则:gnu.org/software/make/manual/make.html#Pattern-Rules
Anycorn 2010年

11
看起来有点像我想要的。但是,恕我直言,make手册有些枯燥,因为它似乎更针对于make的中级水平的开发人员,除此之外,它非常庞大且深入。也许太多了。
奥斯丁·海德

Answers:


180

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

自动依赖图生成

大多数make系统的“必须”功能。随着可在单程通过添加编译的副作用来完成GCC -MMD标志CXXFLAGS -include $(OBJ_FILES:.o=.d) 到生成文件主体的端部:

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

正如大家已经提到的那样,始终随身携带GNU Make Manual,这非常有帮助。


11
啊,你打败我几秒钟。但是我建议OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
Beta

1
我必须对其进行更改才能起作用:$<应该$^以main.exe的规则为准,并且我认为其中存在一个错字obj/%.o: src/%cpp

1
@bobah您缺少一个“。” 在您的对象规则中使用cpp
regomodo 2012年

1
特殊变量可能值得解释,因为它们是特定于Makefile的并且很难搜索:gnu.org/software/make/manual/html_node/Automatic-Variables.html
Blake

2
我知道这是一个古老的问题,但是我根据我的项目做了一些修改,但是没有用。这是我的makefile:pastebin.com/4CksG9Wc 我进入控制台:make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
Mateus Felipe

5

通配符也对我有用,但是我想为那些使用目录变量的人提供一个旁注。始终对文件夹树使用斜杠(而不是反斜杠),否则它将失败:

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

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

你是说正斜线吗?您的示例显示了传统上被视为正斜杠的内容。具体来说,“向右倾斜”被认为是“向前”,向左倾斜的被认为是“向后”
Evan Teran 2014年

是的,您说对了,我的意思是仅“斜杠”。我更新了帖子。
xesf 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.