C++ 依赖于以不同二进制文件创建的对象文件

C++ 依赖于以不同二进制文件创建的对象文件,c++,makefile,object-files,C++,Makefile,Object Files,在创建二进制引擎时,会创建一些对象文件,例如a.o和b.o 生成文件 .PHONY all all: engine cars 现在,第二个二进制cars需要在创建二进制引擎时创建.o文件a.o和b.o 这里的问题是我正在使用make-j进行编译,这在某些情况下会导致未创建目标文件,从而导致未定义引用错误。使用make-j 5时未发现该问题 是否有某种方法可以使它与make-j并行运行通常,make,即使指定了-j,也会尝试从左到右构建依赖项。因此,在您的工作环境中,它首先构建引擎,然后构建汽车

在创建二进制
引擎时,会创建一些对象文件,例如
a.o
b.o

生成文件

.PHONY all
all: engine cars
现在,第二个二进制
cars
需要在创建二进制
引擎时创建.o文件
a.o
b.o

这里的问题是我正在使用
make-j
进行编译,这在某些情况下会导致未创建目标文件,从而导致
未定义引用
错误。使用
make-j 5
时未发现该问题


是否有某种方法可以使它与
make-j

并行运行通常,make,即使指定了
-j
,也会尝试从左到右构建依赖项。因此,在您的工作环境中,它首先构建
引擎
,然后构建
汽车
。若引擎在汽车启动之前就完成了建造,那个么你们就没事了,否则就不行了

在你的例子中,我想象你还有另外四个高级进程,它们与
引擎一起构建,取代了
汽车的运行,因此
引擎在
汽车
以低-j值构建时恰好在
汽车
之前完成

在任何情况下,您都缺少一些依赖项。您需要:

car : a.o b.o
如果汽车依赖于这两个。如果
a.o
b.o
引擎
配方的副作用,那么您可以这样做

car : engine

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

“某些情况”?这是否意味着它是随机发生的?你为什么用CMake标记这个问题?@MichaelChourdakis上面的任何东西
make-j5
到目前为止都失败了,所以我想说它是100%可复制的,这意味着当它使用多个内核运行时,目标文件不是由gcc创建的,那么它似乎是一个gcc错误?与-j 2相同?请显示完整的生成文件。我的猜测是,您没有正确指定
.o
文件上目标
车辆的依赖项。