【问题标题】:How to reuse target in Makefile?如何在 Makefile 中重用目标?
【发布时间】:2021-06-02 02:29:23
【问题描述】:

基本上,我想让文件 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

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

【问题讨论】:

    标签: c++ linux makefile


    【解决方案1】:

    您必须正确设置关系。

    例子:

    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。为此,您有明确的规则。就是这样!

    【讨论】:

      【解决方案2】:

      在 makefile 规则中,您在 : 左侧放置的任何内容都是运行以下命令的产品/结果。在您的示例中,您说targ 产品以三种不同的方式制造,这令人困惑,因为创建targ 的方式不明确。您可能想说的是,为了成功构建targ,您需要创建三个可执行文件file1 file2file3,每个都使用它们对应的.cpp 文件构建。

      为此,您可以依赖implicit rules。对于 C++ 可执行文件,隐式配方将查找具有相同名称的 .o 文件,而对于该 .o 文件,它将查找多个文件名替代项,包括 .cpp

      所以基本上这样的事情就足够了:

      CXX=g++
      targ: file1 file2 file3
      

      隐式配方使用variables 例如CXX 定义C++ 编译器,CPPFLAGS 定义预处理器标志(-I-D 等)编译器和链接器标志CXXFLAGS @ 987654341@ 以及您要链接到 LDLIBS 的库。

      如果您不想依赖隐式规则,可以创建模式配方并使用automatic variables

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

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 1970-01-01
        • 2010-10-10
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多