我正在使用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警告; (怎么样)我可以关掉它们吗?
答案 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")
]