2011-12-22 15 views
1

私はboost.logを使用しています。実際にそれを取得して構築する極端な量のagroは別として、Windows 7とVistaでは正常に動作しています。Windows XPでboost.logがクラッシュするのはなぜですか?

私は現在Windows XP上でアプリケーションを使用しようとしていますが、boost.logは未処理の例外(Access violaton reading location 0x00000000)で吹いています。

これはlog:mt_nt5::sources::aux::set_severity_levelメソッドで発生し、g_SeverityLevelという静的グローバル変数を設定しようとします。

BOOST_LOG_NO_COMPILER_TLSでビルドすることを提案したdocumentが見つかりました。私はこれを試みたが、うまくいかなかった。

I read furtherこれには、グローバル変数の周囲には__declspec(thread)と宣言されている問題があり、そのスレッドは静的になります。これはVista以前のOSでの問題です。

boost.logに静的にリンクしていますので、私のプリプロセッサBOOST_LOG_NO_COMPILER_TLSが認識されない理由を理解できません。

何か不足していますか?

更新:

がどんなにbjamでLIBSを構築するとき、私は何をすべきか、私のBOOST_LOG_NO_COMPILER_TLSフラグが認識されていないされていません。

bjam address-model=32 --toolset=msvc-10.0 --build-type=complete 
    --with-log variant=debug link=static runtime-link=static 
    define=BOOST_LOG_NO_COMPILER_TLS stage 

私は、このフラグを使用してとせずに構築した後stageフォルダ内の出力の内容を比較し、内容が同一である:私はこのように構築しています!

それでは、関連する質問はおそらく次のようになります:私は正しくbjamコマンドラインを使用していますか?

+1

偶然、VC++を使用していて、 '/ clr'でコンパイルしていますか? – ildjarn

+0

VC++(Visual Studio 2010)を使用していますが、/ clrを使用していません –

+1

どのバージョンのXPですか? VC++ 2010では、ターゲットプラットフォームがXP SP2以上である必要があります。 – ildjarn

答えて

2

スレッド静的宣言を使用するためクラッシュします。上記にリンクされた記事で説明したように、ロギングコードを含むDLLにLoadLibrary(COMコンポーネントも同様)がロードされている場合、Vista以前のOSで問題が発生します。

この問題が発生した場合は、boost.logライブラリを再コンパイルしますが、don't forget to clear out your bin.v2 folder first

+0

まだ問題があります。私はWindowsプラットフォーム上で共有ライブラリとしてBoostを使用しています。これは通常のexeとして動作しますが、Windowsのサービスでboostログを使用するとクラッシュします。何か案が? –

関連する問題