gpt4 book ai didi

scons - 如何解决 "scons: warning: Two different environments were specified for target"

转载 作者:行者123 更新时间:2023-12-03 10:27:27 25 4
gpt4 key购买 nike

假设我有一个 SConstruct看起来像这样的文件:

env = Environment()

env.Program("a", ["a.c", "util.c"])
env.Program("b", ["b.c", "util.c"])

此构建正常运行,没有 SCons 警告消息。但是,如果我修改它为每个 Program 指定不同的库构建(实际库不相关):
env.Program("a", ["a.c", "util.c"], LIBS="m")
env.Program("b", ["b.c", "util.c"], LIBS="c")

然后我收到警告:
scons: warning: Two different environments were specified for target util.o,        but they appear to have the same action: $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES

This appears to be caused by the Program builder automatically creating a new environment for building the sources, even though it is just the LIBS variable that is different (and so only the link step needs to have a different environment). I can work around this by doing something like:

util = env.Object("util.c")
env.Program("a", ["a.c"] + util, LIBS="m")
env.Program("b", ["b.c"] + util, LIBS="c")

这使用单个 Object建筑 build 商 util.c ,然后在每个 Program 中使用预编译的目标文件构建,从而避免警告。然而,这真的不是必要的。有没有更优雅的方法来解决这个问题?或者这实际上是 SCons 中应该修复的错误?

上下文:我将近 2000 个 C 源文件编译成大约 20 个库和 120 个可执行文件,其中包含大量共享源。我创建了 SConstruct使用我编写的转换脚本从以前的专有构建系统生成文件。 SCons 使用我当前的 SConstruct 为完整构建生成了大约 450 条“两种不同的环境”警告消息。 .

最佳答案

我找到了一个不涉及创建额外变量来保存目标文件节点的解决方法:

env.Program("a", ["a.c", env.Object("util.c")], LIBS="m")
env.Program("b", ["b.c", env.Object("util.c")], LIBS="c")

这隔离了 util.c 的构建在单一环境中。虽然指定了两次,但每次都指定一次 Program , SCons 不会对此发出警告,因为它是使用相同的 env 构建的相同源代码。目的。当然,在这种情况下,SCons 只编译一次源代码。

关于scons - 如何解决 "scons: warning: Two different environments were specified for target",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194900/

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