【问题标题】:Ignoring specific scons warnings忽略特定的 scons 警告
【发布时间】:2014-11-24 11:40:34
【问题描述】:

我正在使用 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

因此,解决此警告的公认方法是在通用 cpp 文件的源列表中使用 env.Object:

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 警告; (如何)我可以关闭它们吗?

【问题讨论】:

    标签: scons


    【解决方案1】:

    如果您看一下 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")
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-10
      • 2014-03-15
      • 2019-05-26
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2013-06-16
      • 2016-06-05
      相关资源
      最近更新 更多