6

/MT(静的マルチスレッドランタイムライブラリ)でコンパイルされたVisual Studio 2012にdllプロジェクトがあります。また、/MT (ライブラリ A) でコンパイルされたサードパーティの静的ライブラリもリンクしていますが、これまでのところ問題はありません。

問題は別の静的ライブラリ (ライブラリ B) にあり、残念ながら /MD でコンパイルされています。私のdllでは、両方をリンクする必要があり、それらのいずれにも代わるものはありません(別のオプションでそれらを再コンパイルすることはできません)。すべてを正常にリンクできましたが、メモリの割り当てと削除に問題があります。割り当てられたオブジェクトの削除に失敗することもあれば、別の奇妙なエラーが発生することもあります。これは、dll のさまざまな部分で使用されるメモリ管理関数が混在していることが原因であると考えています。間違っているかもしれません。

だから私の質問は、これは本当に混合メモリ管理機能によって引き起こされているのですか? もしそうなら、この仕事をまとめる方法はありますか?

私が考える唯一の解決策は、ライブラリ B を /MD でコンパイルされた別の dll にラップし、元の dll からそれを使用して、異なるメモリ管理関数が使用されるようにすることです。これが役立つかどうかはわかりませんが、避けたいと思います。

4

1 に答える 1

6

ご覧になっている問題の原因については既にご理解いただいているようで、MSDNでは次のように説明されています。

MSDN スクリーンショット

リンクされたすべてのライブラリで同じバージョンの CRT を使用することが本当に不可能な場合は、これらのモジュールの境界を越えて CRT オブジェクトを渡さないようにするしかありません。シナリオでこれを実行できるかどうかは、アプリケーションに完全に依存します。上記の記事の重要なポイントは、次の文です。

境界を越えて CRT オブジェクトを渡すか、メモリを割り当て、DLL の外部で解放されることを期待するように DLL を設計する場合は、DLL ユーザーが CRT ライブラリの同じコピーを DLL として使用するように制限します。DLL とそのユーザーは、両方が同じバージョンの CRT DLL にリンクされている場合にのみ、CRT ライブラリの同じコピーを使用します。

互換性のあるモジュールを取得またはビルドしてアプリケーションにリンクすることはできないと述べていることは知っていますが、これを徹底的に再検討し、さまざまな CRT ライブラリを混在させることは絶対に避けることをお勧めします。

于 2013-06-03T06:50:50.443 に答える