具有多个可执行文件和依赖项的生成文件
Makefile with multiple executables and dependencies
到目前为止,我有一个看起来像这样的 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为你配置它们,你可以,但这并不简单。 有关一些想法,请参阅此讨论。
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 提示存档文件中的动态库依赖项
- 如何在头文件中声明类模板(由于循环依赖关系)
- 对在不同二进制文件中创建的对象文件的依赖关系
- 在链接可执行文件之前查找静态库未解析的依赖项
- 在位置上运行具有依赖项的.exe文件
- 在生成文件中添加源文件并更新依赖项
- 在 Ubuntu 18.04 上,我编译的 cpp 可执行文件找不到 VTK7 依赖项
- cmake:构建依赖于非源文件.Qt帮助生成
- 更改 Cmake 文件以从源代码编译依赖项,而不是使用 FIND_PACKAGE
- 正确的生成文件依赖项列表 (C++)
- 我可以在我的 cmake 代码中手动使用 CMake 的 cpp 文件依赖项扫描程序吗?
- 将所有文件依赖于特定目录的依赖
- g++/c++生成文件依赖项以忽略boost标头
- 生成文件 - 依赖项生成
- 用于查找可执行文件依赖项的命令
- 使用 cmake 处理头文件依赖项
- 库文件依赖项冲突
- 生成文件模式规则:循环生成文件.o < - 删除生成文件依赖项