让 SCons 在一条 gcc 行中编译所有内容?

Posted

技术标签:

【中文标题】让 SCons 在一条 gcc 行中编译所有内容?【英文标题】:make SCons compile everything in one gcc line? 【发布时间】:2014-06-16 16:21:49 【问题描述】:

我有一个相当复杂的 SCons 脚本,可以编译一个大型 C++ 项目。This gcc manual 页面说:

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

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

有没有办法让 SCons 做到这一点?

【问题讨论】:

【参考方案1】:

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

话虽如此,gcc/g++ 优化如手册所述的结果是可观的。特别是如果您有经常使用的 C++ 模板。对运行时性能有利,对重新编译性能不利。

我建议您尝试让自己的构建器满足您的需求。这是另一个具有启发性答案的问题:SCons custom builder - build with multiple files and output one file

【讨论】:

【参考方案2】:

目前的答案是否定的。

与此类似的逻辑仅为 MSVC 开发。 您可以在手册页 (http://scons.org/doc/production/html/scons-man.html) 中看到这一点,如下所示:

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

一如既往,欢迎以更一般的方式添加补丁。

【讨论】:

【参考方案3】:

一般来说,这应该由程序开发人员决定。尝试在合并中编译所有内容可能会给程序带来意想不到的行为,如果它甚至首先编译的话。如果您想在不自己编辑源代码的情况下进行这种优化,最好的选择是使用具有进程间优化功能的编译器,例如 icc -ipo

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

【讨论】:

我很确定 OP 只是希望他的构建系统只运行 g++ filea.cpp fileb.cpp filec.cpp 而不是运行 g++ 3 次,每个源文件一次。 (而不是将所有 3 个文件连接到一个源文件中。) 我不知道您是如何从我的问题中得到的,即我想将所有文件连接到一个文件中……那是……只是……错了。

以上是关于让 SCons 在一条 gcc 行中编译所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

scons gfortran:从链接行中删除“/ out”

STM32F10x随笔(gcc+scons)

MinGw Gcc / Gtk+3 / Cmake 编译程序. 如何去掉控制台窗口?

linux自动化构建工具-scons指南

jsoncpp linux平台编译和arm移植

当我一步编译所有内容时,GCC 可以更好地优化事情吗?