make SCons在一个gcc行中编译所有内容

make SCons compile everything in one gcc line?

本文关键字:编译 gcc 一个 SCons make      更新时间:2023-10-16

我有一个相当复杂的SCons脚本,用来编译一个大型c++项目。
这个gcc手册页说:

编译器根据它对程序的了解执行优化。一次编译多个文件到一个输出文件模式允许编译器在编译每个文件时使用从所有文件中获得的信息。

所以最好把我所有的文件交给一个g++调用,让它随心所欲地驱动编译。
但SCons不这样做。它为项目中的每个c++文件分别调用g++,然后使用ld

将它们链接起来

有办法让SCons这样做吗?

拥有一个能够表达依赖关系的构建系统的主要原因是为了支持某种条件/增量构建。否则,您还不如使用一个脚本和您需要的一个命令。

也就是说,按照手册描述的那样对gcc/g++进行优化的结果是实质性的。特别是如果您有经常使用的c++模板。

对运行时性能有利,对重新编译性能不利

我建议你试着让你自己的建设者做你需要的。下面是另一个问题,答案很鼓舞人心:SCons自定义构建器-构建多个文件并输出一个文件

目前的答案是否定的。

类似的逻辑仅为MSVC开发。您可以在手册页(http://scons.org/doc/production/HTML/scons-man.html)中看到如下内容:

MSVC_BATCH当设置为任何真值时,指定SCons应该在调用Microsoft Visual时批量编译目标文件C/c++编译器。来自同一源的源文件的所有编译目录,在相同的输出目录中生成目标文件使用相同的构建环境在SCons中配置在对编译器的一次调用中构建。只有源文件具有自从它们的目标文件被构建后所做的更改将被传递给每个编译器调用(通过$CHANGED_SOURCES构造变量)。对象(目标)文件基名(减去.obj)不匹配的源文件基名将被编译分开。

一如既往,欢迎补丁以更通用的方式添加此

一般来说,这应该留给程序开发人员。试图在合并中一起编译可能会给程序引入意想不到的行为,即使它首先编译。如果您希望在不编辑源代码的情况下进行这种优化,那么您最好的选择是使用具有进程间优化的编译器,如icc -ipo

合并两个.c文件无法编译的例子是,如果它们使用两个相同的static符号,但功能不同。