Visual Studio Express 2008 を使用してコンパイルされた一連のコードを、Visual Studio 2003 でコンパイルされた .lib にリンクしようとしたときに、興味深い経験がありました。すべて C++ です。正確には、VS2003 で .lib にコンパイルされたSystemC 2.2.0 カーネルと、VS2008 でコンパイルされた SystemC モデルでした。
リンク時に、リンク中に SystemC.lib ファイル (つまり、VS2003 でコンパイルされたもの) からいくつかのシンボルが見つからないというエラーが発生し続けました。得られるエラーは次のとおりです(いくつかのバリエーションがあります):
SystemC.lib(sc_port.obj) : error LNK2001: unresolved external symbol "public: vo
id __thiscall std::_String_base::_Xran(void)const " (?_Xran@_String_base@std@@QB
EXXZ)
さまざまなリードから掘り下げた結果、.lib が期待する機能は次のとおりであることが判明しました。
Undecoration of :- "?_Xran@_String_base@std@@QBEXXZ"
is :- "public: void __thiscall std::_String_base::_Xran(void)const "
VS2008 がリンクしようとしていたライブラリ ファイル (libcpmt.lib) では、別の呼び出し規約が使用されていました。
Undecoration of :- "?_Xran@_String_base@std@@SAXXZ"
is :- "public: static void __cdecl std::_String_base::_Xran(void)"
この非互換性が発生した理由を突き止めようとしましたが、最終的にあきらめて、まったく同じ Visual Studio プロジェクトを VS2008 で再コンパイルし、VS2003 の SystemC.lib の代わりにその SystemC.lib を使用しました。これで、問題なく動作しました。
したがって、ここでの基本的な質問は、VS2003 から VS2008 への変更により、一部の関数の呼び出し規約が変更される原因となるのは何ですか? また、VS2003 コンパイルと同じ呼び出し規則を持つ関数を使用するために、VS2008 のリンカーに与える魔法のフラグはありますか?
更新、これまでの回答の要約: Microsoft が C++ (C ではなく C++ のみ) ABI を Visual Studio のメジャー バージョンから次のメジャー バージョンに変更する可能性が非常に高いです。ライブラリには、非互換性の原因となるその他の変更が含まれている場合もあります。最良のアドバイスは、VS の各バージョンの .lib を再コンパイルすることです。基本的には、ソースでユーザーに出荷し、ユーザーがたまたまインストールした VS のバージョンを使用してローカルでコンパイルするだけです。
基本的な問題は、次のアドバイスを使用して発見されました。
これらの質問はこの問題に答えていないことに注意してください。