【问题标题】:Is there a way to remove text literals from release binary when using boost::log API?使用 boost::log API 时,有没有办法从发布二进制文件中删除文本文字?
【发布时间】:2014-05-28 21:32:19
【问题描述】:

boost 1.55 提供了一个使用 C++ 流插入运算符(也称为左移运算符)的日志记录 API。

虽然语法很方便,但我想不出一种从可执行文件中丢弃调试文本文字的方法。

例如,使用 MFC,TRACE 宏在发布配置中最终成为空行。

使用 TRACE(或任何此类宏函数):

TRACE("This text literal shall only be found in debug configuration");

使用 Boost API:

LOG_DEBUG << "This text literal shall only be found in debug configuration";

我测试了(使用 Visual Studio 2010,编译器完全优化 (/Ox) 启用)How to remove log debugging statements from a program 线程建议,但文字最终出现在发布的可执行文件中(这是有道理的,据我可以预测结果) .

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    这对我有用,但它需要重写日志语句:

    #ifdef _DEBUG
    #define LOG(arg) LOG_DEBUG << arg
    #else
    #define LOG(arg)
    #endif
    

    线

    LOG("This text literal shall only be found in debug configuration");
    

    对于非调试版本,将被预处理为无。流媒体仍然有效:

    LOG("Answer = " << 42);
    

    【讨论】:

      【解决方案2】:

      empty operator&lt;&lt; trick 在 Visual Studio 2008 上确实对我有用。关键似乎不是 compiler 优化标志,而是 linker 优化标志。当我与/OPT:REF(消除未引用的数据)链接时,字符串文字不在可执行文件中。

      有一点令人困惑的是默认设置:

      如果指定了 /DEBUG,则 /OPT 的默认值为 NOREF(否则,它 是REF),所有函数都保留在图像中。

      有人可能会认为这意味着发布版本默认具有/OPT:REF,因此不需要指定标志。然而,在我的 Visual Studio 上,似乎发布版本默认启用了 /DEBUG(这可能很有用,但有点违反直觉),因此如果您想要这种行为,您必须将 /OPT:REF 添加到发布版本标志中。

      【讨论】:

      • 我尝试使用 REF 选项并使用 VS2008 获得相同的结果。我发现链接器与此无关,实际上:我在 VS2008 中生成了一个控制台项目,在 main 之前定义了 DevNull 类(所以在同一个模块中)。在调试中,文字在那里,但不在发布中......显式使用 REF... 或 NOREF!我注意到编译器优化设置为“最大化速度 (/O2)”而不是“完全优化 (/Ox)”,这 IS 有什么不同。结果表明,另一种解决方案更简单且易于移植,但这篇文章也强调了有趣的事实。
      猜你喜欢
      • 1970-01-01
      • 2019-02-12
      • 2015-12-21
      • 2020-06-21
      • 1970-01-01
      • 2023-02-26
      • 2020-03-25
      • 1970-01-01
      • 2014-04-17
      相关资源
      最近更新 更多