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
文件上目标车辆的依赖项。