可以同一个(Boost)DLL合作的多个版本
我的(C ++,跨平台)应用程序大量使用Boost
库(比如版本1.x
),并且我还想使用Boost
(但版本)链接到第三方(供应商)的SDK(无源代码) 1.y
)。
所以,我们都与我们自己的Boost
DLL版本动态链接,CRT是相同的。 因此,在运行时我的应用程序将不得不加载Boost 1.x & 1.y
DLL。
什么是潜在的问题和陷阱相关联?
我无法更改供应商的SDK,但我可以更改我的应用程序。 也许我应该尝试静态链接到我的Boost 1.x
?
PS: Boost
的DLL的名称包括它们的版本,所以没有名称冲突,两者都可以识别。 不是通常的DLL-地狱。
就使用不同版本的DLL而言,应该没有问题。 至少不在Windows上。
如果SDK在内部使用boost,则为真。 如果SDK在其接口中使用boost结构,例如:它有一个返回boost :: optional的函数,那么有多个版本会导致问题。 它依然可以正常工作,取决于版本之间的变化,但这绝对是一个风险。 在这种情况下,我不知道有什么好的解决方案。 如果您包含一个包含boost头文件的SDK头文件,也是如此。
这是个大问题。 做一个DLL地狱的搜索。
基本上,DLL(或Linux中的共享库)已加载,但并非所有名称都在加载时解析。 会发生什么是一个懒惰的评估,所以名字首次使用评估。 问题是,如果2个DLL具有相同的名称,那么解析名称的位置取决于DLL搜索的顺序(取决于加载顺序)。
如果你静态链接,那么你不会遇到方法调用的问题,因为你的所有东西都将在编译时解决,并且第三方将在运行时从DLL中解析。 但是,由版本-1提升创建的结构呢? 如果您将这些传递给第三方库,然后将它传递给版本x提升。 结构是否以同样的方式布置?
这是一个非常棘手的领域,当问题发生时很难解决。 所以请尝试使用相同的版本。
如果你编写一个函数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名称不同,我看不出问题。
链接地址: http://www.djcxy.com/p/42527.html上一篇: Can multiple versions of a same (Boost) DLL co
下一篇: How can I check for SSL vulnerabilities on my web server?