如何解决“缺点:警告:为目标指定了两个不同的环境”

问题描述

|| 假设我有一个看起来像这样的“ 0”文件
env = Environment()

env.Program(\"a\",[\"a.c\",\"util.c\"])
env.Program(\"b\",[\"b.c\",\"util.c\"])
此版本正常工作,没有SCons警告消息。但是,如果我修改它以为每个
Program
版本指定不同的库(实际的库不相关):
env.Program(\"a\",\"util.c\"],LIBS=\"m\")
env.Program(\"b\",LIBS=\"c\")
然后我得到警告: scons:警告:为目标util.o指定了两个不同的环境,         但它们似乎具有相同的作用:$ CC -o $ TARGET -c $ CFLAGS $ CCFLAGS $ _CCCOMCOM $ SOURCES 这似乎是由ѭ2生成自动创建用于构建源的新环境引起的,尽管只是ѭ5变量不同(因此,仅链接步骤需要具有不同的环境)。我可以通过以下方法解决此问题:
util = env.Object(\"util.c\")
env.Program(\"a\",[\"a.c\"] + util,[\"b.c\"] + util,LIBS=\"c\")
这将使用单个“ 7”构建器来构建“ 8”,然后在每个“ 2”构建中使用预编译的目标文件,从而避免了警告。但是,这实际上不是必需的。有没有更优雅的方法解决此问题?还是这实际上是应该修复的SCons中的错误? 上下文:我将近2000个C源文件编译成约20个库和120个可执行文件,其中包含许多共享源。我使用编写的转换脚本从以前的专有构建系统创建了“ 0”文件。 SCons使用我当前的
SConstruct
生成大约450条“两种不同的环境”警告消息以进行完整构建。     

解决方法

        我找到了一种解决方法,该方法不涉及创建额外的变量来保存目标文件节点:
env.Program(\"a\",[\"a.c\",env.Object(\"util.c\")],LIBS=\"m\")
env.Program(\"b\",[\"b.c\",LIBS=\"c\")
这样可以在一个环境中隔离build8的构建。尽管指定了两次,但对于每个
Program
,SCons都不会发出警告,因为它是使用相同的
env
对象构建的相同源。当然,在这种情况下,SCons只会编译一次源。     ,        您可以使用Split功能和自定义帮助程序来简化大型项目的构建过程:
def create_objs(SRCS,path=\"\"):
    return [env.Object(path+src+\".cpp\") for src in SRCS]

prg1 = Split(\"file_1 file_2 file_N\")
prg2 = Split(\"file_2 file_5 file_8\")

env.Program(\"a\",create_objs(prg1),LIBS=\"x\")
env.Program(\"b\",create_objs(prg2),LIBS=\"y\")
目标文件仅创建一次,并且可以在多个版本中使用。希望这可以帮助...     ,        我在代码中发现的一个问题是我没有正确使用目标对象路径。或者换句话说,我有一个变体的dir指令,但是我没有使用BUILDPATH而是使用了原始的源代码路径。 Scons通过这种方式找到在目标BUILDPATH和源路径中生成的对象。     ,        从第一组文件中创建一个静态库并将该库链接到下一组文件(这些文件与第一组文件有一些共同点)以创建目标也是可行的。
env.StaticLibrary (\"a\",\"util.c\"],LIBS = \"m\")
env.Program (\"b\",LIBS = [\"c\",\"a\"])