2011-12-22 118 views
1

我正在使用boost.log。除了极端数量的agro实际获得并构建它之外,它在Windows 7和Vista上一直运行正常。为什么在Windows XP上boost.log崩溃?

我现在尝试使用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建设。我试过了,但没有奏效。

I read further进入此问题,并且问题似乎是全局变量被宣布为__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文件夹中的内容,其内容是相同的!

因此,一个相关的问题可能现在是:am我正确使用bjam命令行?

+1

一次偶然的机会,您使用VC++与'/ clr'编制? – ildjarn 2011-12-22 19:28:28

+0

我正在使用VC++(Visual Studio 2010),但没有使用/ clr – 2011-12-22 19:37:52

+1

什么版本的XP? VC++ 2010要求目标平台至少为XP SP2。 – ildjarn 2011-12-22 19:58:26

回答

2

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

如果你有这样的问题,然后重新编译boost.log库,但don't forget to clear out your bin.v2 folder first

+0

我仍然有问题。我使用Boost作为Windows平台上的共享库,起诉VC++ 2010.它可以像正常的exe一样工作,但是在windows服务中使用boost日志时会崩溃。任何想法? – 2014-09-12 12:18:37