【问题标题】:Dependency on object files which are created in different binary对在不同二进制文件中创建的目标文件的依赖
【发布时间】:2020-05-04 08:51:35
【问题描述】:

在创建二进制文件engine 时,会创建一些目标文件a.ob.o

生成文件

.PHONY all
all: engine cars

现在第二个二进制文件cars 需要在创建二进制文件engine 时创建.o 文件a.ob.o

这里的问题是我使用make -j 进行编译,在某些情况下会导致未创建目标文件并因此出现undefined reference 错误。 make -j 5 未发现此问题。

有没有办法让它与make -j并行运行

【问题讨论】:

  • “某些情况”?这是否意味着它是随机发生的?
  • 你为什么用 CMake 标记这个问题?
  • @MichaelChourdakis 以上make -j 5 的任何东西现在都失败了,所以我会说它是 100% 可重现的,这意味着当它使用多个内核运行时,目标文件不会在那时创建
  • 那么似乎是 gcc 错误? -j 2 也一样?
  • 请显示完整的makefile。我的猜测是您没有正确指定目标cars.o 文件的依赖关系。

标签: c++ makefile object-files


【解决方案1】:

通常,即使指定了-j,make 也会尝试从左到右构建依赖关系。因此,在您的工作案例中,它首先构建engine,然后构建car。如果引擎在car 启动之前完成构建,那么你很好,否则你就不行。

在您的情况下,我想象您还有四个与engine 一起构建的高级进程,它们取代了car 的运行,因此engine 恰好在car 之前完成当您使用低 -j 值构建时。

无论如何,您都缺少一些依赖项。您需要:

car : a.o b.o

如果汽车依赖于这两个。如果a.ob.oengine 配方的副作用,那么您可能会这样做

car : engine

注意:即使您的 makefile 碰巧使用了较低的 -j 值,Makefile 也不应该假定从左到右的构建顺序,也不应该对任何配方的运行时间做出任何假设——所以你是makefile 确实从一开始就被破坏了。

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2020-08-03
    • 2017-12-24
    • 2017-11-11
    • 2011-06-07
    • 2018-04-19
    相关资源
    最近更新 更多