【发布时间】:2012-04-05 12:46:56
【问题描述】:
我正在使用 GCC 4.7 并编译我的 C++ 代码项目。代码由分布在目录中的文件组成。
在我使用的 RHEL 服务器上,有 16 个内核,但编译速度仍然很慢。您能否建议 makefile 的可能替代方案或选项,这可能有助于快速编译。我试过 -j 但它只编译一些文件夹并停止;不编译主二进制文件。
如果有任何帮助,我将不胜感激。
【问题讨论】:
标签: compilation makefile
我正在使用 GCC 4.7 并编译我的 C++ 代码项目。代码由分布在目录中的文件组成。
在我使用的 RHEL 服务器上,有 16 个内核,但编译速度仍然很慢。您能否建议 makefile 的可能替代方案或选项,这可能有助于快速编译。我试过 -j 但它只编译一些文件夹并停止;不编译主二进制文件。
如果有任何帮助,我将不胜感激。
【问题讨论】:
标签: compilation makefile
如果您使用-j 编译时您的makefile 失败,但不使用它也可以正常工作,那么您可能需要修复您的makefile 以在并行编译中正常工作。否则,其他 15 个核心对你没有用处。
对于经验不足的 makefile 编写者来说,编写类似以下内容的情况并不少见:
final: step1 step2 step3
意思是“构建最终,首先构建步骤1,然后步骤2,然后步骤3”。当您使用-j 1 的默认设置运行时,这可以正常工作,因为make 碰巧以从左到右的顺序构建每个依赖项。但是如果你使用-j 20(比如),那么它将尝试并行构建它们。它将尝试立即开始构建所有 3 个步骤,而无需先等待每个后续步骤完成。
正确的写法是:
final: step3
step3: step2
step2: step1
这告诉make到底发生了什么:要构建final,您首先需要构建step3,为此您需要step2,为此您需要step1。
【讨论】: