2009-04-14 9 views
5

私はVisual C++ 2008 SP1を使用しています。私はデバッグビルド設定でQTアプリ(GUI、.exe)を持っています。これは、CRTのMulti-threaded Debug DLLバージョン、MSVCRTD.libを使用するように設定されています。リリースビルドライブラリ(MSVCRT.lib)に対してどのようにデバッグ.exe(MSVCRTD.lib)をビルドしますか?

リリースモードでビルドされたマルチスレッドDLL(非デバッグ)バージョンのCRT(別名MSVCRT.lib)を使用しているサードパーティのライブラリとリンクしています。

リンク時に実行されますが、起動時にクラッシュします。リンク中に警告が表示されます:

リンク:警告LNK4098:defaultlib 'MSVCRT'は他のライブラリの使用と競合します。使用/ NODEFAULTLIB:ライブラリ

私は

/NODEFAULTLIB:msvcrt.lib

設定しようとしたが、それが欠けているシンボルによる誤差を結ぶ5になりました。

2つの異なるライブラリを使用することはできませんか?代替手段は何ですか?私が持っているサードパーティライブラリからDLLを作成できますか?それとも第三者がやるべきことなのでしょうか?起動時

例外がある:

"MYAPP.EXE中で未処理の例外.......:...... アクセス違反読み取り位置0x00000000f"

以下でありますアプリの後にコールスタックが実行され、それがクラッシュ:混合およびデバッグを照合し、構成ライブラリを離したときに、私はこれと同様の問題を見てきました

MyApp.exe!std::_Aux_cont::_Getcont() + 0xa bytes C++ 
MyApp.exe!std::_Iterator_base_aux::_Getmycont() + 0x1b bytes C++ 
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::const_iterator::operator*() + 0x28 bytes C++ 
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::iterator::operator*() + 0xf bytes C++ 
MyApp.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> > >::operator[]() + 0xe9 bytes C++ 
MyApp.exe!ThirdPartyLib::client::`anonymous namespace'::init_xlt_mode() + 0x5f bytes C++ 
[email protected]() + 0x8d8f3 bytes C++ 
msvcr90d.dll!_initterm(void (void)* * pfbegin=0x006c4468, void (void)* * pfend=0x006cb0b8) Line 903 C 
MyApp.exe!__tmainCRTStartup() Line 501 + 0xf bytes C 
MyApp.exe!WinMainCRTStartup() Line 403 C 
kernel32.dll!7c817067()  
+0

起動時にクラッシュするのは何ですか? – LeopardSkinPillBoxHat

+0

こんにちは、私はちょうど上記の元の記事をより詳細とあなたの質問への答えで更新しました。 – ApplePieIsGood

答えて

10

リリースCRTとリンクするプロジェクトをビルドして、コードのデバッグ情報を有効にすることができます。 "Project Properties"でC++/Generalに行き、Debug Information Formatを変更します。 [最適化]セクションで最適化を無効にします。 「リンカ/デバッグ」セクションに切り替え、デバッグ情報の生成を有効にします。プログラムデータベースファイル(PDB)を必ず設定してください。

この時点で、アプリケーションはコード内のすべてのデバッグ情報を生成し、DLL以外のDLL CRTとリンクします。これにより、同じアプリケーションで複数のCRTを使用する際の問題を回避しながら、リリース構成でアプリケーションをデバッグすることができます。

+1

ビンゴ、これは命の恩人です!私は解決策としてこの答えをマークしようとしていますが、それは何らかの理由で私をさせません。どうもありがとう! – ApplePieIsGood

+0

それは良いです。 – ApplePieIsGood

2

これは時にはうまくいくことがありますが、見た目のような不明瞭なクラッシュ(エントリポイントの不一致など)が発生することがあります。

私はそれらを見るように選択肢は以下のとおりです。

  • (あなたはできるだけ多くのデバッグを取得することができなくなります(MSVCRT.dllからそれを指して)、リリース構成でアプリケーションを構築し、これが動作するかどうかを確認します問題の原因を特定するのに役立つかもしれません)。

  • サードパーティライブラリがオープンソースの場合は、.libファイルのデバッグバージョンを自分でビルドしてみてください。

  • それ以外の場合は、デバッグバージョンがオンラインで入手可能かどうか、またはベンダーにお問い合わせください。

申し訳ありませんが、私はより多くの助けができませんでした。正しいライブラリにアクセスして回避する方法を見つけようとすれば、長期的にはもっと早くなると思います。

+0

私はリリースモードで私のアプリをビルドするとうまくいくと言っていたはずですが、あなたが言うように、私が知る限り何でもデバッグすることはできません。私はベンダーに尋ねましたが、最初はデバッグバージョンを提供できるとは思われませんでした。私は彼らを説得しようとしています。 – ApplePieIsGood

関連する問題