有没有办法在使用boost :: log API时从发布二进制文件中删除文本文字?

时间:2014-05-28 21:32:19

标签: c++ boost

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线程建议但文字最终在发布中的可执行文件中(这是有意义的,据我所知,结果)。

2 个答案:

答案 0 :(得分:0)

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

#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);

答案 1 :(得分:0)

empty operator<< trick在Visual Studio 2008上对我有用。关键似乎不是编译器优化标志,而是链接器优化标志。当我链接/OPT:REF(消除未引用数据)时,字符串文字不在可执行文件中。

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

  

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

有人可能认为这意味着默认情况下Release版本会有/OPT:REF,因此不需要指定标志。但是,在我的Visual Studio上,似乎默认情况下Release版本已启用/DEBUG(这可能很有用但有点违反直觉)所以如果你必须将/OPT:REF添加到Release版本标志中想要那种行为。