がクラッシュし、それは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の+
'regsvr32'は**ありません**魔法のスイッチ "私のDLLを動作させる" です。あなたが何をしているのか分からないなら、なぜそれを使用していますか?これはカーゴカルチャーのプログラミングです。 'regsvr32'は、その引数が_needs_と_supports_ registrationの両方であることを期待しています。ランダムなDLLを渡すとクラッシュする可能性があります。 'regsvr32'またはDLLのクラッシュを責めないでください。クラッシュはコマンドラインによって引き起こされます。 – MSalters
@MSalter、私は明確に説明しなかった、私は 'regsvr32'が問題を解決するとは思わない。 load.dllをロードするにはloader.exeが必要です。まず、 'regsvr32'が' LoadLibrary'を呼び出すので、my.dllのテストに使用できます。そして私がvs2015で自分自身でloader.exeを書くと、exeが 'tls'環境を最初に初期化するため、クラッシュは起こりません。 – aj3423