【问题标题】:Dependencies in makefilemakefile 中的依赖关系
【发布时间】:2023-04-02 19:24:01
【问题描述】:

我有一个 makefile,一个 sn-p 看起来像这样(为清楚起见重命名了文件和目标):

target1 : OtherLib.o MyProg.h MyProg.cpp g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o

当我运行“make target1”时,我想检查一下 MyProg.h 和 MyProg.cpp 是否是最新的,如果不是,则运行 target1。但是,我收到错误

make: *** 没有规则来制作目标 `MyProg.cpp',`target1' 需要。停止。

但“MyProg.cpp”是我要编译的!所以,我给它做了一个空的目标,像这样:

MyProg.h: MyProg.cpp: target1 : OtherLib.o MyProg.h MyProg.cpp g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o

这可行,但看起来很奇怪。我的印象是,如果我只是这样做:

目标1:OtherLib.o g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o

然后 MyProg 将被编译,无论它是否是最新的,因为 MyProg.cpp 没有被列为依赖项。这样做的正确方法是什么,以便只有在 MyProg.cpp 和 MyProg.h 不是最新的情况下,make 才会编译 MyProg.o?

【问题讨论】:

    标签: dependencies makefile


    【解决方案1】:

    这似乎不应该发生。也许您应该仔细检查拼写错误。如果您的操作系统对您隐藏文件扩展名,我会特别怀疑这一点。

    【讨论】:

    • 我快乐编译的黄金法则——永远不要使用大小写混合的文件名。
    • 或带空格的文件名或文件夹。导致命令行解析出现很多问题。
    【解决方案2】:

    我无法重现您的问题。您可以尝试使用 -d 选项运行 make 以获取有关 make 尝试执行的操作的非常详细的历史记录。我最好的猜测是它出于某种原因在错误的目录中查找。

    【讨论】:

      【解决方案3】:

      我认为由于没有生成名为target1 的可执行文件,因此您的目标target1 实际上将是一个虚假目标,并且将始终执行相应的命令。所以你的代码无论如何都会被编译。
      虽然我也无法重现您的问题:No rule to make target `MyProg.cpp'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多