我的(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。
答案 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名称不同,我认为没有问题。