假设我有一个看起来像这样的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: 警告:为目标util.o指定了两个不同的环境, 但它们看起来有相同的操作:$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES
这似乎是由于Program
构建器自动为构建源文件创建了一个新的环境,即使只有LIBS
变量不同(因此只需要在链接步骤中使用不同的环境)。我可以通过执行以下操作解决此问题:
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
文件。 对于当前的SConstruct
进行完整构建时,SCons会产生大约450个“两个不同环境”警告消息。