我正在写 my.dll ,它将在 WinXP 上运行,它使用' vs2015 '编译并使用'提升1.64.0 32位预建库'。
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_TLS
,BOOST_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 +
答案 0 :(得分:0)
最后,我找到了解决方案,只需添加cxxflags="/Zc:threadSafeInit- "
即可构建提升功能,请注意&#39; - &#39;之后的搜索空间,否则可能会导致问题。
例如:
G:\boost>b2 variant=debug link=static threading=multi runtime-link=shared cxxflags="/Zc:threadSafeInit- "
所有库都应使用此标志在VisualStudio中构建:
配置属性 - &gt; C / C ++ - &gt;命令行,添加/ Zc:threadSafeInit-
for cmake:
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zc:threadSafeInit-")