gpt4 book ai didi

scons:更改单个源文件的编译标志

转载 作者:行者123 更新时间:2023-12-04 22:47:15 25 4
gpt4 key购买 nike

我有一个相当复杂的 scons 系统,有几个子目录,有许多库和可执行文件。
目前,每个 SConscript 都有自己的克隆环境,因此我可以轻松地在每个 SConscript 的基础上更改 CFLAGS(或任何其他易受攻击的),但我想针对每个目标甚至每个对象文件更改它目标。

我创建了一个简单的示例 SConscript 和 SConstruct 来解释问题,如下所示。

S构造:

env = Environment()
env['CFLAGS'] = '-O2'
env.SConscript('SConscript', 'env')

征兵:
Import('env')
env=env.Clone()
env.Program('foo', ['foo.c', 'bar.c'])

如果我运行 scons,foo.c 和 bar.c 都使用 -O2 标志编译。我可以通过添加 env['CFLAGS'] = '...' 轻松更改 SConscript 范围内的标志在 SConscript 中,但假设我想用 -O2 编译 foo.c , 但 bar.c 完全调试, -O0 -g .我该怎么做(以最简单的方式)?

该示例使用 gcc,但我想要可以与任何编译器一起使用的东西。

这种情况经常发生在对性能敏感的项目中,在这种情况下,在没有优化的情况下编译所有内容会导致 Not Acceptable 性能,但需要调试单个文件(或其中的一个子集)。

最佳答案

最简单的单行答案可能只是用以下内容替换您的 Program 行:

env.Program('foo', ['foo.c', env.Object('bar.c', CFLAGS='-g')])

因为 Program 可以接受对象节点以及源文件,并且您可以覆盖任何构建器中的任何构造变量(在这里,我们在对象构建器调用中覆盖 CFLAGS)。为了清楚起见,如果您想将 Object 分成自己的一行:
debug_objs = env.Object('bar.c', CFLAGS='-g')
env.Program('foo', ['foo.c', debug_objs])

当然,把它发挥到极致,你就会得到一个像上面显示的 Avatar33 这样的系统。

关于scons:更改单个源文件的编译标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19188494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com