2009-03-27 16 views
7

Boostライブラリ(バージョン1.x)を使用しているMy(C++、クロスプラットフォーム)アプリは、Boostを使用してサードパーティ(ベンダー)のSDK(ソースなし) 1.y)。同じ(ブースト)DLLの複数のバージョンを同じプロセスで共存させることはできますか?

私たちはどちらも、私たち自身のバージョンBoost DLLに対して動的にリンクしています。CRTは同一です。したがって、実行時に、私のアプリケーションはBoost 1.x & 1.yの両方のDLLをロードする必要があります。

潜在的な問題& gotchasとは何ですか?

ベンダーのSDKを変更することはできませんが、アプリを変更することはできます。たぶん私はBoost 1.xと静的にリンクしようとするべきですか?

PS:BoostのDLLの名前にはバージョンが含まれているため、名前の衝突はなく、どちらも識別できます。通常のDLLファイルではありません。

答えて

0

foo関数を書き込んでF.dllから書き出し、別の関数fooをG.dllから書き出した場合は、問題はありますか?

AF.exeがリンクされている場合、リンカーに次のように伝えられます。そこにF.dllから関数fooのアドレスをロードするコードを入力します。今すぐBG.dllはG.dllからfooアドレスを取得するためにリンクされています。私はまだ何の問題も見ません。

AF.exeをアプリで置き換え、BG.dllをベンダーのアプリケーションで、F.dllをブーストバージョンで、G.dllをベンダーのブーストバージョンで置き換えます。

結論:dllの名前が異なると問題はありません。

2

異なるバージョンのDLLを使用する限り、問題はありません。少なくともWindows上ではありません。

これは、SDKが内部的にブーストを使用している場合に当てはまります。たとえば、boost :: optionalを返す関数がある場合、複数のバージョンで問題が発生する可能性があります。バージョン間の変更に依存しても問題なく動作しますが、それは間違いなく危険です。私はその場合に良い解決策を知らない。これは、ブーストヘッダーファイルを含むSDKヘッダーファイルを含める場合にも当てはまります。

2

これは大きな問題です。 DLL hellで検索します。

基本的にDLL(またはLinuxの共有ライブラリ)は読み込まれますが、読み込み時にすべての名前が解決されるわけではありません。何が起きるかは怠惰な評価なので、最初の使用時に評価されます。問題は、2つのdllが同じ名前を持つ場合、名前が解決される場所は、DLLの検索順序(読み込み順序に依存する)によって異なります。

静的にリンクすると、コンパイル時にすべてが解決され、DLLから実行時にサードパーティが解決されるため、メソッド呼び出しに問題は発生しません。しかし、バージョン1のブーストによって作成される構造体はどうでしょうか?これらを第三者のライブラリに渡すと、それをバージョン-xのboostに渡します。構造体も同様にレイアウトされていますか?

これは非常に扱いにくい領域で、問題が発生したときにバグを解消するのが非常に難しいです。 同じバージョンを試してみてください。

関連する問題