如何在Makefile中重用目标?



基本上,我想让这段代码在文件Makefile可执行文件:

targ: file1.cpp
g++ file1.cpp -o file1
targ: file2.cpp
g++ file2.cpp -o file2
targ: file3.cpp
g++ file3.cpp -o file3

我知道我可以把它组合成这样:

targ: file1.cpp file2.cpp file3.cpp
g++ file1.cpp -o file1
g++ file2.cpp -o file2
g++ file3.cpp -o file3

但是我希望它只在相应的文件更新时运行相应的行。我该怎么做呢?提前谢谢。

在makefile规则中,您在:左侧放置的任何内容都是运行以下命令的产物/结果。在你的例子中,你说targ产品有三种不同的制造方法,这是令人困惑的,因为制造targ的方法是模糊的。您可能想说的是,为了成功构建targ,您需要创建三个可执行文件file1file2file3,每个可执行文件都使用相应的.cpp文件构建。

对于这个目的,您可以依赖隐式规则。对于c++可执行文件,隐式配方将查找具有相同名称的.o文件,对于.o文件,它将查找包括.cpp在内的多个文件名替代。

所以基本上像这样的东西应该足够了:

CXX=g++
targ: file1 file2 file3

隐式配方使用变量,如CXX来定义c++编译器,CPPFLAGS来定义预处理器标志(-I,-D等),编译器和链接器标志CXXFLAGS,LDFLAGS以及要链接到LDLIBS的库。

如果你不想依赖隐式规则,你可以创建一个模式配方并使用自动变量:

target: file1 file2 file3
%: %.cpp
g++ $^ -o $@

你必须建立正确的关系。

的例子:

targ: file1 file2 file3
file1: file1.cpp
g++ file1.cpp -o file1
file2: file2.cpp
g++ file2.cpp -o file2
file3: file3.cpp
g++ file3.cpp -o file3

说:

如果你想构建targ(你也应该把它设为PHONY), make看到你将构建file1file2file3。对于这个,你有明确的规则。这就是它!

最新更新