我正在使用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
的静态全局变量。
我发现document建议使用BOOST_LOG_NO_COMPILER_TLS
进行构建。我尝试了这个,但它没有用。
我read further进入此问题,问题似乎是全局变量被声明为__declspec(thread)
,这使得它成为静态线程。这只是Vista之前操作系统的一个问题。
我正在静态链接到boost.log,所以我无法弄清楚为什么我的预处理器BOOST_LOG_NO_COMPILER_TLS
无法识别。
我错过了什么吗?
更新
无论在使用bjam
构建lib时我做了什么,我的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
文件夹中输出的内容,并且内容完全相同!
所以,相关的问题现在可能是:我正确使用bjam命令行吗?
答案 0 :(得分:2)
崩溃是因为它使用了线程静态声明。如上面链接的文章中所述,如果包含日志代码的DLL加载了LoadLibrary(也包含COM组件),则会导致Vista之前的操作系统出现问题。
如果您遇到此问题,请重新编译boost.log库,但don't forget to clear out your bin.v2 folder first!