1

私の問題の原因は、私が Visual C++ 2008 でコンパイルされた共有ライブラリに依存しているが、他のライブラリは Visual C++ 2010 でコンパイルされていることにあると考えています (現在、私は Visual C++ 2010 を使用しています)。

これらのライブラリは std に大きく依存しています。DLL の一部の関数は、引数として std オブジェクトを必要とし、std オブジェクトを返します (たとえば、std::string)。

std ライブラリのバージョンが異なっていても、これらの DLL を実行可能ファイルと互換性を持たせることはできますか?

この種の問題に対する標準的な解決策があるはずですが、見つかりませんでした。正しい方向に向けてください。

4

2 に答える 2

1

Stephan T. Lavavejは、C++ オブジェクトのバイナリ互換性はコンパイラのメジャー バージョン間で保証されていないため、別のバージョンでビルドされたコンポーネントの API に STL オブジェクトを渡すことは問題になる可能性が高いと何度か言っているのを聞いたことがあります。多くの STL オブジェクトはテンプレートであるため、大幅にインライン化されていることに注意してください。境界を越えて STL オブジェクトを渡すと、そのインライン化が両側で発生している可能性があります。STL の実装が異なる境界の両側でコードをコンパイルすると、問題が発生する可能性があります。

これらの種類の問題は、コンポーネント間でオブジェクトを安全に渡す方法として、COM のようなものが発明されたものです。

すべてを COM に変更しない限り、C++ オブジェクトを共有するすべてのライブラリが同じコンパイラの同じバージョンでビルドされていることを確認するのが最善の策です。これらの DLL を新しいコンパイラで再構築できない場合は、古いコンパイラでコードをコンパイルする必要があります。

于 2012-06-07T15:52:49.203 に答える
1

異なるバージョンの msvc の std オブジェクトを使用できる可能性がありますが、バイナリ互換性があるかどうかはわかりません。

クラッシュの原因となることが多いオブジェクトの破壊を検索できます。特定のモジュールで作成されたオブジェクトは、同じ CRT で処理できるように、その特定のモジュールで削除する必要があります。この条件が満たされない場合、動作は未定義です (クラッシュする可能性があります)。

最も安全な解決策は、すべてのオブジェクトをインターフェイスにカプセル化することです。「 dll から C++ クラスをエクスポートする方法」を参照してください。

于 2012-06-07T08:28:10.353 に答える