同一个(Boost)DLL的多个版本可以在同一个进程中共存吗?

时间:2009-03-27 11:19:53

标签: c++ dll boost version

我的(C ++,跨平台)应用程序大量使用Boost库(比如版本1.x),我还希望链接第三方(供应商)的SDK(否)来源),本身使用Boost(但版本1.y)。

因此,我们都动态链接到我们自己的Boost DLL版本,CRT是相同的。因此,在运行时,我的应用程序必须加载Boost 1.x & 1.y的两个DLL。

有哪些潜在问题&陷阱相关吗?

我无法更改供应商的SDK,但我可以更改我的应用。也许我应该尝试静态链接我的Boost 1.x

PS:Boost的DLL的名称包括它们的版本,因此没有名称冲突,两者都是可识别的。不是通常的DLL-hell。

3 个答案:

答案 0 :(得分:2)

对于使用不同版本的DLL,应该没有问题。至少不在Windows上。

如果SDK在内部使用boost,则会出现这种情况。如果SDK在其接口中使用boost构造,例如:它有一个返回boost :: optional的函数,那么有多个版本可能会导致问题。它仍然可以正常工作,取决于版本之间的变化,但这肯定是一个风险。在这种情况下,我不知道有什么好的解决方案。如果包含包含boost头文件的SDK头文件,也是如此。

答案 1 :(得分:2)

这是一个大问题。 在DLL地狱上搜索。

基本上加载了DLL(或Linux中的共享库),但并非所有名称都在加载时解析。发生的是懒惰的评估,因此在首次使用时会评估名称。问题是,如果2 dll具有相同的名称,则解析名称的位置取决于搜索DLL的顺序(取决于加载顺序)。

如果您静态链接,那么您将不会遇到方法调用问题,因为您的所有问题都将在编译时解决,第三方将在运行时从DLL解析。但是由版本1提升的结构呢?然后,如果您将这些传递给第三方库,然后将其传递给version-x boost。结构是否以同样的方式布局?

这是一个非常棘手的领域,当问题发生时很难去除bug。 所以尝试使用相同的版本。

答案 2 :(得分:0)

如果您编写函数foo,并从F.dll导出它,以及从G.dll导出的另一个函数foo,您会遇到问题吗?

当链接AF.exe时,会告诉链接器:在那里放入一些代码从F.dll加载函数foo的地址。现在链接BG.dll以从G.dll检索foo地址。我仍然认为没问题。

现在将AF.exe替换为您的应用程序,将BG.dll替换为您的供应商的应用程序,将F.dll替换为您的升级版本,将G.dll替换为供应商的升级版本。

结论:如果dll名称不同,我认为没有问题。