4

VS2010 と VS2012 の間のコンパイル済みライブラリのバイナリ互換性について混乱しています。VS2012 に移行したいのですが、多くのクローズド ソースのバイナリのみの SDK は、VS2010 用にのみ提供されています (たとえば、ハードウェア デバイスとのインターフェイス用の SDK など)。

伝統的に、私の知る限り、Visual Studio はコンパイラのバージョンに関して非常にうるさいものでした。VS2010 では、VS2008 用にコンパイルされたライブラリにリンクできませんでした。

私が今混乱している理由は、私が VS2012 への移行の過程にあり、いくつかのプロジェクトを試したからです。最大の驚きは、それらの多くがクロスバージョンで問題なく動作することです。

注: v100 モードについて話しているのではありません。私の知る限り、これは VS2010 コンパイル エンジン上の VS2012 GUI にすぎません。

VS2012 で VS2010 ソリューションを開き、[更新] をクリックして、何が起こるかを確認することについて話しています。

ブーストなどのより大きなライブラリにリンクすると、コンパイラのバージョンのチェックがあり、エラーが発生してコンパイルが中止されるため、コンパイルが機能しませんでした。他のいくつかのライブラリは、関数が欠落しているときに単に中止されます。これは私が期待していた動作です。

一方、多くのライブラリは、エラーや追加の警告なしで正常に動作します。

それはどのように可能ですか?VS2012 は、VS2010 ライブラリとのバイナリ互換性を維持するために特別な方法で作成されましたか? 動的リンクと静的リンクに依存しますか?

そして最も重要な質問: コンパイル時にエラーが発生しなくても、VS2012 プロジェクトを VS2010 でコンパイルされたライブラリにリンクするときにバグが発生しないコンパイラを信頼できますか?

4

1 に答える 1

3

「多くのライブラリは正常に機能します。どのように可能ですか?」</p>

1) lib は静的 RTL を使用するようにコンパイルされているため、コードは衝突する 2 番目の RTL DLL を取り込みません。

2) コードは完全にヘッダー ファイル内にある関数のみを呼び出す (および構造体などを使用する) ため、リンカー エラーは発生しません。または、新しい RTL にまだ存在する関数を呼び出すため、リンカー エラーは発生しません。 、

3) レイアウトや意味が変更された構造体では何も呼び出さないため、クラッシュしません。

気になるのは#3です。インポートを使用して、それが何を使用しているかを確認し、完全なリストを作成できますが、どれが互換性があるかについてのドキュメントや保証はありません。実行されているように見えるからといって、潜在的なバグがないわけではありません。

の可能性もあります

4) 標準ライブラリ呼び出しを完全に使用しないように、かなり低レベルのドライバー SDK またはその他のコードが作成されました。

また(私が思うにあなたの状況ではありません)DLLは分離され、独自のRTLを持ち、異なる体制間で(メモリの割り当てや解放など)物をやり取りすることはできません。インプロセス COM サーバーはこのように動作します。DLLは、渡すものと返すもの、およびポインターなどの操作に注意すれば、一般にこれを行うことができます。たとえば、Crypto++ は、囲んでいるプログラムのメモリ ルーチンで初期化され、コンパイルに使用された RTL バージョンから malloc されたメモリを公開しません。

于 2014-09-15T22:29:54.953 に答える