在使用boost::log API时,有没有办法从发布二进制文件中删除文本文本? Boost 1.55使用C++流插入操作符(否则命名为左移位运算符)提供日志API。

在使用boost::log API时,有没有办法从发布二进制文件中删除文本文本? Boost 1.55使用C++流插入操作符(否则命名为左移位运算符)提供日志API。,c++,boost,C++,Boost,虽然语法很方便,但我想不出从可执行文件中丢弃调试文本文本的方法 例如,使用MFC,TRACE宏最终在发布配置中变成一个空行 使用跟踪(或任何此类宏函数): 使用Boost API: LOG_DEBUG << "This text literal shall only be found in debug configuration"; LOG\u DEBUG这对我很有效,但需要重写日志语句: #ifdef _DEBUG #define LOG(arg) LOG_DEBUG <&

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

例如,使用MFC,TRACE宏最终在发布配置中变成一个空行

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

使用Boost API:

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

LOG\u DEBUG这对我很有效,但需要重写日志语句:

#ifdef _DEBUG
#define LOG(arg) LOG_DEBUG << arg
#else
#define LOG(arg)
#endif
对于非调试生成,将预处理为零。流媒体也同样有效:

LOG("Answer = " << 42);
LOG(“Answer=“在Visual Studio 2008上对我有效。键似乎不是编译器优化标志,而是链接器优化标志。当我链接(消除未引用的数据)时,字符串文本不在可执行文件中

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

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


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

我尝试使用REF选项并使用VS2008获得相同的结果。我发现链接器与此无关,事实上:我在VS2008中生成了一个控制台项目,在main之前定义了DevNull类(因此在同一模块中)。在调试中,文本存在,但在发布版中没有。显式使用REF…或NOREF!我注意到编译器优化设置为“最大化速度(/O2)”而不是“完全优化(/Ox)”这就是区别所在。最终,另一个解决方案更简单,更易于移植,但这篇文章也强调了一些有趣的事实。
LOG("This text literal shall only be found in debug configuration");
LOG("Answer = " << 42);