具有多个可执行文件和依赖项的生成文件

Makefile with multiple executables and dependencies

本文关键字:文件 依赖 可执行文件      更新时间:2023-10-16

到目前为止,我有一个看起来像这样的 Makefile:

# Program list:
# a.cpp, a.h,
# b.cpp, b.h,
# c.cpp. c.h,
# d.cpp, d.h,
# commonA.cpp, commonA.h,
# commonB.cpp, commonB.h,
# mainA.cpp, mainB.cpp,
# mainC.cpp, mainD.cpp.

CXX=g++
CXXFLAGS = -std=c++11 -g -Wall
prog1: mainA.cpp a.cpp
$(CXX) $(CXXFLAGS) programOne mainA.cpp a.cpp
prog2: mainB.cpp b.cpp
$(CXX) $(CXXFLAGS) programTwo mainB.cpp b.cpp
prog3: mainC.cpp c.cpp commonA.cpp
$(CXX) $(CXXFLAGS) programThree mainC.cpp c.cpp commonA.cpp
prog4: mainD.cpp d.cpp commonA.cpp commonB.cpp
$(CXX) $(CXXFLAGS) programFour mainD.cpp d.cpp commonA.cpp commonB.cpp
# etc...

我看过制作GNU文档,它相当令人生畏 - 我试图从中尽可能多地理解。我想知道我的例子如何能够比现在更缩短它?有没有一个好的规则可以使用,可以为上面的程序列表中的每个文件创建所有对象文件,然后我为每个部分包含特定的对象?任何帮助都非常感谢!

这里有一个提示:make 具有知道如何创建各种不同目标的内置规则。 利用它们将为您提供尽可能短的生成文件。

下面是另一个提示:make 使用字符串比较来匹配目标、先决条件和规则。 因此,明智地选择文件和程序的名称将提供利用make内置规则的最佳机会。

例如,您已经知道源文件foo.cpp将被编译为目标文件foo.o。 Make 有一个内置规则,可以为您处理这个问题。 如果还选择命名其中一个源文件,以便它映射到要创建的程序的名称,则可以利用内置规则来链接程序。

如上面的评论所述,您的规则被破坏了,因为 makefile 目标被命名为一件事(例如,prog1(,但链接行生成了不同的东西:programOne(在这里我假设您在发布代码时只是忘记了链接行中的-o选项......请记住,在SO或任何地方寻求帮助时,最好创建一个SSCE(。 对于非特殊目标,这绝不应该发生;每个规则都应创建一个与目标同名的文件。

通常,对于 C/C++ 程序,包含main()的源文件的名称与要创建的程序的名称相同。 因此,例如,如果要创建一个程序programOne则包含main()的源文件应命名为programOne.cpp

如果遵循这些建议,则整个生成文件可以只是:

CXX = g++
CXXFLAGS = -std=c++11 -g -Wall
all: programOne
programOne: programOne.o a.o

仅此而已。 Make 知道如何为您构建这些目标,这样您就不必告诉它。 如果您想要更多程序,只需添加它们:

all: programOne programTwo
programOne: programOne.o a.o
programTwo: programTwo.o b.o

剩下的一个问题是头文件先决条件。 如果你愿意,你可以像这样自己声明它们:

programOne.o: programOne.h a.h

等。 这非常简单,但维护起来很乏味。 如果你想让make为你配置它们,你可以,但这并不简单。 有关一些想法,请参阅此讨论。