Visual Studio 2015でレガシーVisual Studio 6.0 C++アプリケーションをコンパイルしています。このエラーに遭遇し、ネットを検索しても有用な情報が得られません。
LNK2019未解決の外部シンボル__except_handler4_commonが関数__except_handler4で参照されています(MSVCRT.lib)
コードのどこかで、現在のバージョンのMSVCRTに存在しないメソッド(?)を参照していることを理解しています。これに対する回避策/コンパイラフラグはありますか?
エラーメッセージは、実際には、MSVCRT.LIBで定義されている関数__except_handler4
が未定義のシンボル__except_handler4_common
を参照していることを示しています。つまり、この参照を行っているのはあなたのコードではなく、Visual Studio 2015のコードです。
シンボル__except_handler4_common
はvcruntime.libで定義されています。このファイルは自動的にリンクされるはずです。リンクされなかった理由はわかりません。プロジェクトオプション(「マルチスレッド(/ MT)」)で静的ランタイムライブラリを選択してから、手動でMSVCRT.LIB(動的Cランタイムライブラリの一部)を追加しましたか?
ライブラリプロジェクトで、[プロパティ]-> [C/C++]-> [コード生成]-> [ランタイムライブラリ]を確認します。
「マルチスレッドデバッグDLL」(/ MDd)に設定されている可能性があります。
その場合は、「マルチスレッドデバッグ」(/ MTd)に変更して、再構築してください(これでうまくいきました)。
このエラーの理由は状況によって異なります。
私にとって、それはGUIの「ランタイムライブラリ」フィールドから選択するのではなく、リンカー入力の間に明示的にリストされた「libcmt.lib」と「libcmtd.lib」でした。
私にとっては、非静的単体テストから静的プロジェクトのオブジェクトにリンクしていました。単体テストを静的ビルドに設定しようとしましたが、コンパイラ(VC++ 2015)でエラーAn internal error has occurred in the compiler
が発生しました。結局、メインプロジェクトと単体テストプロジェクトの両方を「共有DLLでMFCを使用する」に設定すると、うまくいきました。