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