忽略特定的scons警告

时间:2014-11-24 11:40:34

标签: scons

我正在使用scons进行构建。我遇到了以下警告(编译在多个构建目标中使用的某些类时):

scons: warning: Two different environments were specified for target /home/stackuser/src/dsl/build/debug/common/LocalLog.o,
but they appear to have the same action: $CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES

因此,围绕此警告的可接受方法是在源列表中使用env.Object来获取常见的cpp文件:

client_srcs = [
    env.Object("../common/LocalLog.cpp"),
    env.Object("../common/LogMsg.cpp"),
    "LogWriter.cpp",
    "QueueConsumer.cpp",
    env.Object("../common/QueueStore.cpp"),
    env.Object("../common/TimeFunctions.cpp")
]

但是,在常见cpp文件周围使用此env.Object函数时,某些目标不会构建(链接器错误链接到boost):

/usr/include/boost/system/error_code.hpp:208: undefined reference to `boost::system::get_system_category()'
/usr/include/boost/system/error_code.hpp:209: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::get_generic_category()'

此链接器错误为described here;总结接受的答案:

  

静态链接时,链接器需要库来   在包含对它们的引用的文件之后。你需要移动你的   你的-l标志之前的.o文件。

但是,如果我只是删除SConscript中的env.Object调用,我会收到这些scons警告,但编译和链接成功。

我只想忽略这些scons警告; (怎么样)我可以关掉它们吗?

1 个答案:

答案 0 :(得分:3)

如果您仔细查看MAN页面(http://scons.org/doc/production/HTML/scons-man.html),您会发现“warn = no-all”选项......以及许多其他有用的内容。

但请注意,关闭此警告通常是个坏主意,因为它暗示了构建描述中的缺陷。你告诉SCons从两个(或更多)不同的环境构建一个像“debug / common / LocalLog.o”这样的文件。只要使用的命令行(以及环境,包括所有shell变量设置)完全相同,这可能会起作用,这就是SCons继续的原因。 但通常你想要一个单一方式来构建一个特定的目标文件。

你的困境有三种正确的解决方案(可能更多,但这些是我立即想到的):

1。)将您想要在多个地方使用的源/对象放入一个单独的库中,然后链接到该文件。

2.。)每次编译相同的* .CPP文件时,请为目标文件(LocalLog_a.o,LocalLog_b.log,...)提供不同的唯一名称。

3.。)编译源一次(env.Object('LocalLog.cpp'),然后将生成的目标文件添加到相关程序/库的源列表中:

client_srcs = [
    "../common/LocalLog.$OBJSUFFIX",
    "../common/LogMsg.$OBJSUFFIX",
    "LogWriter.cpp",
    "QueueConsumer.cpp",
    "../common/QueueStore.$OBJSUFFIX",
    "../common/TimeFunctions.$OBJSUFFIX")
]