2017-05-15 61 views
0

我写my.dll这对的WinXP运行,它与 'vs2015' 和使用“升压1.64.0 32位预建库编译'。DLL +升压+ VS2015 + WinXP的==崩溃

这里只有一个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(预建窗口二进制)+编译标志( “/ MT/ZC:threadSafeInit-”)

测试环境: 崩溃于:WinXP_sp3/Win2003_R2 上正常工作:最后的Win7 +

+0

'regsvr32'是**不**魔 “让我的DLL工作” 开关。如果你不知道它做了什么,你为什么使用它?这是货运崇拜节目。 'regsvr32'预计它的参数是一个既有_needs_又有_supports_注册的DLL。传递随机DLL会导致崩溃。不要责怪'regsvr32'或DLL上的崩溃,崩溃是由您的命令行引起的。 – MSalters

+0

@MSalter,我没有解释清楚,我不指望'regsvr32'解决这个问题。我只需要一个loader.exe加载my.dll,'regsvr32'首先调用'LoadLibrary',这样它就可以用来测试my.dll。如果我用vs2015自己写一个loader.exe,崩溃就不会发生,因为exe首先初始化'tls'环境。 – aj3423

回答

0

,我找到了解决办法,只需添加cxxflags="/Zc:threadSafeInit- "打造提振,请注意后有一个tralling空间“ - ”,否则可能会引起问题。

例如:

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

而且所有的库应该使用此标志来编译,VisualStudio中:

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

为cmake的:

set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zc:threadSafeInit-") 
+0

您可能忽略了更大的问题,针对XP需要不同的工具集。如果您使用VS2015,则为v140_xp。这种选择也必须在建立提升时进行。 –

+0

@HansPassant谢谢,但真的需要用v140_xp构建所有库吗?我有很多经验,我总是用v140构建像boost/cryptopp/jsoncpp/protobuf /等这些库,并且只构建.exe /。DLL与v140_xp,它似乎总是工作正常。 – aj3423