我遇到静态库的问题。我需要在一个DLL中使用相同SDK的2个不同版本,而不会发生名称冲突。我认为解决方案是为每个版本的SDK制作2个静态库,然后将这些库导入DLL。但这个解决方案很奇怪,我不知道为什么......
简化情况如下:
LIB1 - 有一个使用SDK 1.0中的东西的函数Add1
LIB2 - 有一个功能Add2,它使用来自SDK 2.0的东西
DLL-导入LIB1和LIB2并且有函数Add(float version)调用Add1或Add2 - 取决于参数中的版本号
编译过程没问题,但DLL仅适用于一个版本SDK :(
当我调试它时,我看到程序调用DLL中的Add函数,参数版本为2.0。然后添加真正调用Add2 - 所以这仍然是正确的。然后在Add2函数中,它使用SDK 1.0中定义的东西而不是SDK 2.0! LIB2实际上是使用SDK 2.0创建的。 (包括dirs和lib目录设置为SDK 2.0)
那为什么它使用SDK 1.0? :(
是否因为链接器在创建DLL时将所有内容连接在一起,而SDK 1.0中的符号覆盖SDK 2.0中的符号??? (没有不同的名称空间)。
你知道问题出在哪里吗?有什么解决办法吗?
非常感谢!
我使用Visual C ++ 2010 ...
答案 0 :(得分:2)
您观察到的行为可能是由链接器选项中列出库的顺序引起的。尝试以相反的顺序列出它们,你可能会观察到“相反”的行为。
我认为你不能混合匹配具有相同符号的库。您最好的办法是将至少一个库(或两者)包装在单独的DLL中,而不是将不同的符号暴露给您的“客户端”DLL(即不同的名称空间甚至不同的名称)。