我正在编写要在WinXP上运行的my.dll,它使用“vs2015”进行编译,并使用“boost 1.64.0 32bit预建库”。

my.dll只有一行代码:

#include <boost/thread/shared_mutex.hpp>

尝试通过WinXP上的regsvr32加载它(regsvr32调用LoadLibrary):
regsvr32 my.dll

从windbg无法加载,我发现访问冲突-代码c0000005

我尝试了旧版本1.63,同样的问题。我猜想它与vs2015的魔术静电有关,试图添加编译标志“/ Zc:threadSafeInit-”以禁用它,但还是没有运气。

似乎有像BOOST_LOG_USE_COMPILER_TLSBOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION这样的编译标志来禁用某些特定库的线程安全,但是我看不到任何可以对Boost.Thread做到这一点的标志。

任何的想法?

我的开发环境是:Win10 + VS2015(更新3)+ boost_1.64.0_msvc14_32bit(预构建的Windows二进制)+编译标志(“/ MT / Zc:threadSafeInit-”)

测试环境:
崩溃:WinXP_sp3 / Win2003_R2
在以下情况下可以正常工作:Win7 +

最佳答案

最后,我找到了解决方案,只需添加cxxflags="/Zc:threadSafeInit- "来构建boost,请注意'-'后面有一个中间空格,否则可能会引起问题。

例如:

G:\boost>b2 variant=debug link=static threading=multi runtime-link=shared cxxflags="/Zc:threadSafeInit- "

在Visual Studio中,所有库都应使用此标志构建:

配置属性-> C / C++->命令行,添加/ Zc:threadSafeInit-

对于cmake:
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zc:threadSafeInit-")

07-26 01:19