gpt4 book ai didi

c++ - 具有多个可执行文件和依赖项的 Makefile

转载 作者:行者123 更新时间:2023-11-28 04:39:58 27 4
gpt4 key购买 nike

到目前为止,我有一个如下所示的 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...

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

最佳答案

这里有一个提示:make 有内置的规则,知道如何创建各种不同的目标。利用它们将为您提供最短的 makefile。

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

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

正如上面评论中提到的,您的规则被打破了,因为 makefile 目标被命名为一个东西(例如,prog1)但是链接行生成了一个不同的东西:programOne (这里我假设你只是在发布代码时忘记了链接行中的 -o 选项......请记住,在 SO 上寻求帮助时 - 或者实际上在任何地方 - 它是最好创建一个 SSCE )。非特殊目标永远不会发生这种情况;每个规则都应该创建一个与目标同名的文件。

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

如果您遵循这些建议,那么您的整个 makefile 可以是:

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 为你配置它们,你可以,但这并不简单。参见 this discussion一些想法。

关于c++ - 具有多个可执行文件和依赖项的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com