やあ。c ++プログラムを別のバージョンのVisualStudioで構築されたダイナミックライブラリ(DLL)にリンクすると、バイナリ互換性の問題のために機能しないことを知っています。(私はBoostライブラリとVS 2005および2008でこれを経験しました)
MSがABIを変更するのを見たことがないので、技術的に異なるバージョンのコンパイラーは同じ出力を生成します(同じフラグが与えられます(以下を参照))。
したがって、これはDev Studioの非互換性ではなく、Boostの変更であると思います。
ブーストの異なるバージョンは下位互換性がありません(バイナリでは、ソースは下位互換性があります)。
しかし、私の質問は次のとおりです。これは、MSVSのすべてのバージョンに当てはまりますか?
問題はないと思います。これで、異なるフラグを使用すると、オブジェクトファイルに互換性がなくなる可能性があります。これが、デバッグ/リリースバイナリが別々のディレクトリに組み込まれ、標準ランタイムの異なるバージョンに対してリンクされている理由です。
これは静的ライブラリ(LIB)にも当てはまりますか?
正しい静的ライブラリに対してリンクする必要があります。ただし、静的ライブラリがコードに含まれると、そこでスタックし、解決されたすべての名前が後日再解決されることはありません。
これはGCCとLinuxでも問題ですか?
はい。GCCは、ABIの下位互換性を数回破っています(意図的にいくつか(誤っていくつか))。Linuxのコードは通常ソースとして配布され、プラットフォームでコンパイルすると機能するため、これは実際の問題ではありません。
そして最後に、VSでMinGWで構築されたDLLにリンクするのはどうですか?
すみません、わかりません。
ちなみに、クロスプラットフォームやクロスコンパイラ以外に、同じコンパイラ(VS)の2つのバージョンが互換性を持たないのはなぜですか?
十分に最適化されたコードオブジェクトはさらに圧縮される可能性があるため、配置が異なります。他のコンパイラフラグは、他のバイナリオブジェクトと互換性のないコードの生成方法に影響を与える可能性があります(関数の呼び出し方法(スタック上のすべてのパラメータまたはレジスタ内の一部のパラメータ)を変更する)。技術的には、まったく同じフラグでコンパイルされたオブジェクトのみをリンクする必要があります(技術的には、多くのフラグがバイナリ互換性に影響を与えないため、それよりも少し緩いです)。
一部のライブラリは、異なる方法でコンパイルされた同じライブラリの複数のバージョンでリリースされていることに注意してください。通常、ライブラリは最後の拡張子で区別されます。私の最後の仕事では、次の規則を使用しました。
libASR.dll // A Sincgle threaded Relase version lib
libASD.dll // A Single threaded Debug version
libAMR.dll // A Multi threaded Release version
libAMD.dll // A Multi threaded Debug version