静的異なるCランタイムライブラリのバージョン、OKか悪いかで構築されたライブラリをリンク?

StackOverflow https://stackoverflow.com/questions/1872759

質問

このシナリオを考えます。 サードパーティのライブラリAへのアプリケーションのリンクます。

Aは、CランタイムライブラリV9.0にMSVC 2008使用して構築されており、静的にリンクされている(すなわち。/ MTで構築された)。

アプリケーションは、MSVC 2005を使用して構築され、静的CランタイムライブラリV8.0をAにリンクし、(/ MTを使用して)されている。

私はこれで問題を見ることができます - 例えばタイプは、ランタイムライブラリのバージョン間のヘッダに変更された場合。

バージョン間の互換性ランタイムライブラリヘッダを保つように注意され、または1つは、常にすべての静的にリンクされたライブラリは、ランタイムライブラリの同じバージョンにリンクされていることを確認する必要がありますか?

役に立ちましたか?

解決

これはのはの問題になることはありません。各ライブラリの独自のランタイムへのリンクとは独立プロセスで他のライブラリから、ほとんど機能しています。問題は、ライブラリはABIがひどく定義されている場合についてきます。ヒープ割り当てられたオブジェクトのいずれかの種類が異なるヒープマネージャを割り当てるために使用されるヒープマネージャからブロックを解放するために使用されているような問題があるように予定されている、1つのライブラリに割り当てられるライブラリーの境界を越えて渡されると、別のライブラリに「解放」された場合これます。

Cランタイム定義された構造体の任意の種類は、オブジェクトまたはエンティティは、異なるランタイムのバージョンが使用されている可能性がありますboundries accross渡すべきではありません - 例えば1つのライブラリーから得られFILE * 'sは異なるライブラリには何の意味もありません異なるランタイムにリンクされます。

限り、ライブラリのAPIの使用のみと生タイプ、およびポインタで渡された)(自由にしようと、あるいは自由に内部でmalloc関数は、アプリケーション(または別のライブラリを)期待している() 'Dメモリへのポインタを渡すことはありません。 ()[OK]をする必要があります。

そのCのランタイムが混在している場合は、「何かが間違って行くことができる」というFUDのために落ちるが、あなたがLIBS、およびダイナミックライブラリが(.soは/の.dll /は.dylib)伝統的に開発されていることを覚えておく必要がありやすいです言語の多種多様:有効なCPU効率的なバイナリインタフェースを介しcomminicateするASMで書かれたコード、C、C ++、フォートラン、パスカルなどせる

CはCにリンクされているときに、なぜ突然パニック?

他のヒント

これは非常に悪い計画です。避ける。どちらの2005年に、ライブラリを再コンパイルするか、2008年にアプリケーションをコンパイルします。

で、すべてではない良いアイデア。あなたは、ランタイムライブラリとどのように彼らは、特定の種類を実装することでなされた仮定を制御することはできません。これは、より多くの可能性がない以上不浄混乱を作成する予定です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top