2017-05-15 14 views
0

がクラッシュし、それはvs2015 'でコンパイルされますと' ブースト1.64.0 32ビット構築済みのライブラリを使用しています '。DLL +ブースト+ VS2015 + WinXPの==は私が<em>WinXPの</em>で実行する<em>my.dll</em>を書いて

my.dllためのコードの唯一の行があります:

#include <boost/thread/shared_mutex.hpp> 

はWinXPの(します。regsvr32がLoadLibraryのを呼び出す)にします。regsvr32を経由して、それをロードしてください:

regsvr32 my.dll 

それはロードに失敗し、 windbgからアクセス違反があります - コードc0000005

私は古いバージョン1.63を試しましたが、同じ問題です。私はそれがvs2015の魔法の静的に関連していると思う、それを無効にするためにコンパイルフラグ "/ Zc:threadSafeInit-"を追加しようとしましたが、まだ運がありません。

特定のライブラリに対してスレッドセーフを無効にするためのBOOST_LOG_USE_COMPILER_TLS,BOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSIONなどのコンパイルフラグがあるようですが、Boost.Threadのためのフラグはありません。

私のdevの環境がある:Win10 + VS2015(更新3)+ boost_1.64.0_msvc14_32bit(ビルド済みのWindowsバイナリ)+コンパイルフラグ( "/ MT/Zcは:threadSafeInit-")

テスト環境: クラッシュ上:WinXP_sp3/Win2003_R2 に正常に動作します: - それ以外の場合は、問題を引き起こす可能性があり、「」win7の+

+0

'regsvr32'は**ありません**魔法のスイッチ "私のDLLを動作させる" です。あなたが何をしているのか分からないなら、なぜそれを使用していますか?これはカーゴカルチャーのプログラミングです。 'regsvr32'は、その引数が_needs_と_supports_ registrationの両方であることを期待しています。ランダムなDLLを渡すとクラッシュする可能性があります。 'regsvr32'またはDLLのクラッシュを責めないでください。クラッシュはコマンドラインによって引き起こされます。 – MSalters

+0

@MSalter、私は明確に説明しなかった、私は 'regsvr32'が問題を解決するとは思わない。 load.dllをロードするにはloader.exeが必要です。まず、 '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ですべてのライブラリを構築することは本当に必要ですか?私はboost/cryptopp/jsoncpp/protobuf/etcなどのライブラリをv140だけで構築し、.exe /をビルドするだけで多くの経験があります。v140_xpのdll、それは常にうまくいくようです。 – aj3423

関連する問題