9

My (C++, cross-platform) app is heavily using Boost libraries (say version 1.x), and I want to also link against a 3rd-party (vendor)'s SDK (no source), itself using Boost (but version 1.y).

So, we both link dynamically against our own version of Boost DLLs, CRT being identical. Consequently, at run-time my app would have to load both DLL of Boost 1.x & 1.y.

What are the potential issues & gotchas associated?

I can't change vendor's SDK, but I can change my app. Maybe I should try to link statically against my Boost 1.x?

PS: Name of Boost's DLL include their version, so no name collision, both are identifiable. Not the usual DLL-hell.

4

3 に答える 3

2

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

これは、SDKが内部でブーストを使用している場合に当てはまります。SDKがインターフェイスでブースト構造を使用している場合、たとえば、ブースト::オプションを返す関数があり、複数のバージョンがあると問題が発生する可能性があります。バージョン間の変更によっては、それでも正常に機能する可能性がありますが、それは間違いなくリスクになります。その場合の良い解決策はわかりません。これは、ブーストヘッダーファイルを含むSDKヘッダーファイルを含める場合にも当てはまります。

于 2009-03-27T13:51:27.007 に答える
2

これは大きな問題です。DLL地獄を検索してください。

基本的に、DLL(またはLinuxの共有ライブラリ)がロードされますが、ロード時にすべての名前が解決されるわけではありません。何が起こるかは遅延評価であるため、名前は最初の使用時に評価されます。問題は、2つのdllが同じ名前である場合、名前が解決される場所は、DLLが検索される順序(ロードの順序によって異なります)によって異なることです。

静的にリンクする場合は、コンパイル時にすべて解決され、実行時にDLLからサードパーティが解決されるため、メソッド呼び出しに問題はありません。しかし、バージョン1のブーストによって作成された構造についてはどうでしょうか。次に、これらをサードパーティのライブラリに渡すと、サードパーティのライブラリがバージョンxブーストに渡します。構造は同じように配置されていますか?

これは非常にトリッキーな領域であり、問​​題が発生した場合はバグを取り除くのが非常に困難です。したがって、同じバージョンを使用してみてください。

于 2009-03-27T18:01:52.177 に答える
0

関数を作成し、fooそれを F.dll からエクスポートし、別の関数fooを G.dll からエクスポートした場合、問題が発生すると予想されますか?

AF.exe がリンクされると、リンカーに次のように指示されますfoo。F.dll から関数のアドレスをロードするコードをそこに配置します。これで、BG.dll がリンクされ、fooG.dll からアドレスが取得されます。まだ問題はありません。

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

結論: dll 名が異なっていても問題はありません。

于 2009-03-27T13:34:43.537 に答える