假设我有一个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
这似乎是由Program
构建器自动创建一个新的环境来构建sources,尽管这只是LIBS
不同的变量(因此只有link步骤需要有不同的环境)。我可以通过执行以下操作来解决此问题:
util = env.Object("util.c")
env.Program("a", ["a.c"] + util, LIBS="m")
env.Program("b", ["b.c"] + util, LIBS="c")
这使用单个Object
建筑建造者util.c
,然后在每个中使用预编译的目标文件Program
构建,从而避免警告。然而,这并不是真正必要的。有没有更优雅的方法来解决这个问题?或者这实际上是 SCons 中应该修复的错误?
上下文:我有近 2000 个 C 源文件编译成大约 20 个库和 120 个可执行文件,其中包含大量共享源。我创建了SConstruct
使用我编写的转换脚本从以前的专有构建系统中获取文件。 SCons 为使用我当前的完整构建生成了大约 450 条“两种不同环境”警告消息SConstruct
.