到目前为止,我有一个看起来像这样的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文档,这是相当令人生畏的 - 我试图尽可能多地了解它。我想知道我的例子如何能够比现在更能缩短它?是否有一个好的规则可以使上面的程序列表中的每个文件的所有目标文件,然后我包括每个部分的特定对象?非常感谢任何帮助!
答案 0 :(得分:1)
这里有一个提示:make有内置的规则,知道如何创建各种不同的目标。利用它们将为您提供最短的makefile。
以下是另一个提示:make使用字符串比较来匹配目标,先决条件和规则。因此,明智地选择文件和程序的名称将最有可能利用make的内置规则。
例如,您已经知道源文件foo.cpp
将被编译为目标文件foo.o
。 Make有一个内置规则,可以为您处理。如果您还选择为其中一个源文件命名,使其映射到您要创建的程序的名称,则可以利用将链接程序的内置规则。
如上面的评论所述,您的规则被破坏,因为makefile目标被命名为一件事(例如,prog1
),但链接行生成了不同的东西:programOne
(这里我和#39 ;假设您在发布代码时忘记了链接行中的-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
就是这样。让你知道如何为你建立这些目标,这样你就不必告诉它。如果你想要更多的程序,也可以添加它们:
all: programOne programTwo
programOne: programOne.o a.o
programTwo: programTwo.o b.o
剩下的一个问题是头文件先决条件。如果你愿意,你可以这样自己声明:
programOne.o: programOne.h a.h
等。这很简单但很难维护。如果你想让make为你配置它们,你可以,但它并不简单。有关一些想法,请参阅this discussion。