【问题标题】:Makefile with multiple executables and dependencies具有多个可执行文件和依赖项的 Makefile
【发布时间】:2018-05-19 05:12:25
【问题描述】:

到目前为止,我有一个如下所示的 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 文档,这相当令人生畏——我试图从中尽可能多地理解。我想知道以我的示例为例,我如何才能将其缩短得比现在还要短?是否有一个很好的规则可以使用上面程序列表中每个文件的所有目标文件,然后我包含每个部分的特定对象?非常感谢任何帮助!

【问题讨论】:

  • 您的目标通常应该与它们产生的输出同名。所以prog1 应该是programOne
  • 您的问题相当广泛,但研究这个答案可能很有用:stackoverflow.com/a/28860795/3807729
  • 请注意,您的所有规则都会生成相同的输出 -- a.out -- 因为您从未在命令中的任何位置指定输出文件的名称。您需要提供更多关于您希望 makefile 实现什么的详细信息。

标签: c++ makefile


【解决方案1】:

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

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

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

正如上面的 cmets 中提到的,您的规则被破坏了,因为 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 了解一些想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2012-02-08
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多