我正在一个项目中工作,我们刚刚使用GNU Make为我们的构建系统添加了并行性。
我们并行构建库和程序。
首先,我们构建二进制文件所需的所有库。创建库后,我们开始构建二进制文件。
现在,在运行我们的程序时,我们发现其中一个二进制文件没有按预期运行。 GNU Make可能会在并行构建时导致二进制文件损坏但仍能正确链接吗?如果是这样,那么常见原因是什么以及如何避免它?
答案 0 :(得分:3)
正确的并行构建取决于正确的makefile。如果构建是串行但不是并行工作,这意味着你的makefile没有声明它需要的所有先决条件,所以make没有意识到在目标Y完成之前它不能构建目标X.
然而,极不太可能这些错误会使构建成功:也就是说,如果事情以错误的顺序构建,编译器或链接器几乎总会失败。我很难想象构建会如何成功,除非是最纯粹的机会,如果有的话(也许你的工具会覆盖现有文件而不是删除它并从头开始编写)。当然,你没有提供关于“不按预期运行”的含义的信息,因此很难确定。
要调查您需要进行一些测试:每次进行并行构建时,它是否会以相同的方式失败?即使您使用不同数量的并行(不同-j
级别),它是否会失败?如果切换回非并行构建,它会继续失败吗?即使您从一个完全干净的工作区(没有构建)开始,构建是否会以-j
成功?