13

2つのシナリオがあります。C ++シンボルをエクスポートする3つの共有ライブラリがあり、それぞれがVS7.1、VS8、およびVS9で構築されているとします。3つすべてをVS9でコンパイルします。何らかの理由で、これは機能します。シンボルを正常に見つけてそれらに対してリンクするために、VS9リンカー用にVS9の最初の2つのライブラリを再コンパイルする必要はありません。

さて、C構文(extern "C")を使用してシンボルのみをエクスポートするライブラリがある場合、これは同じですか?ABI for Cは標準化されていると言われているので、VisualStudio8でコンパイルされたCライブラリをすべてのバージョンのVisualStudioで使用できるという保証があります。

基本的に、これらすべての組み合わせは混乱を招きます。異なるバージョンのVisualStudio間でC++ベースとCベースの両方の共有ライブラリ(対応するインポートライブラリを使用)に対してリンクすることについて、どのような保証があるのか​​わかりません。他のバージョンのVisualStudioでのCおよびC++インポートライブラリまたは静的ライブラリの両方の下位/下位互換性に関する一般的なコンセンサスを聞きたいです。

これが私に思い浮かんだ理由は、私が使用しているVisual Studio .NET 2003(VS7.1)でコンパイルされたクローズドソースライブラリがあるためです。私のチームは、これがVS 7.1コンパイラにロックされていると考えていますが、VS8とVS9の両方、さらにはVS2010でこれらのライブラリをテストし、正常にリンクしています。しかし、これに内在する危険性についてはよくわかりません。問題のライブラリにはCバリアントとC++バリアントがあることに注意してください。基本的に、Cバリアントは標準Cエクスポートであり、C++ライブラリはCライブラリとエクスポートクラスを抽象化したものです。

4

2 に答える 2

4

この問題は、これらのVSバージョン間のABIの違い(呼び出し規約など)だけでなく、システムDLLライブラリの削除/変更されたシンボルにもある可能性があります。VS8(2005、Windows SDK 5.0)とVS9(2008、Windows SDK 6.0)のシステムDLLライブラリの詳細な比較については、この表を参照してください。

WindowsSDKの互換性マトリックスも参照してください。

ここに画像の説明を入力してください

于 2012-02-13T07:14:42.847 に答える
2

extern "C"エクスポートされたシンボルは、C++シンボルとは異なります。C ++には名前マングリングがあります(http://en.wikipedia.org/wiki/Name_manglingを参照)。

C ++シンボルのマングリングは、コンパイラーのバージョンごとに異なる可能性があるため、VS7 / 8/9セットアップでは、同じC++メソッド名が異なる名前にマングルされる可能性があります。

基本的に、あなたのチームは正しいようです-あなたはあなたのライブラリをコンパイルするために使用されたのと同じメジャーバージョンのコンパイラに閉じ込められます。

于 2012-02-10T18:56:26.710 に答える