1

我正在使用 boost.log。除了实际获取和构建它的大量agro之外,它在 Windows 7 和 Vista 上运行良好。

我现在正尝试在 Windows XP 上使用该应用程序,但 boost.log 出现未处理的异常 ( Access violaton reading location 0x00000000)。

这发生在log:mt_nt5::sources::aux::set_severity_level尝试设置名为 的静态全局变量的方法中g_SeverityLevel

我找到了一份建议使用BOOST_LOG_NO_COMPILER_TLS. 我试过这个,但它没有用。

我对此进行了进一步阅读,问题似乎出在声明为的全局变量周围__declspec(thread),这使得它成为线程静态的。这只是 Vista 之前的操作系统的问题。

我静态链接到 boost.log,所以我不知道为什么我的预处理器BOOST_LOG_NO_COMPILER_TLS没有被识别。

我错过了什么吗?

更新:

无论我在使用 构建库时做什么bjam,我的BOOST_LOG_NO_COMPILER_TLS标志都不会被识别。我正在建造这样的:

bjam address-model=32 --toolset=msvc-10.0 --build-type=complete 
  --with-log variant=debug link=static runtime-link=static   
  define=BOOST_LOG_NO_COMPILER_TLS stage

我对比了stage有无这个flag构建后文件夹中输出的内容,内容是一样的!

所以,一个相关的问题现在可能是: 我是否正确使用了 bjam 命令行?

4

1 回答 1

2

它崩溃是因为它使用线程静态声明。如上面链接的文章中所述,如果包含日志记录代码的 DLL 使用 LoadLibrary(也包括 COM 组件)加载,这会导致 Vista 之前的操作系统出现问题。

如果你有这个问题,那么重新编译 boost.log 库,但不要忘记先清除你的 bin.v2 文件夹

于 2011-12-23T11:42:12.273 回答