gpt4 book ai didi

c++ - 静态库

转载 作者:行者123 更新时间:2023-11-28 03:45:53 25 4
gpt4 key购买 nike

我对静态库有疑问。我需要在一个 DLL 中使用同一个 SDK 的两个不同版本,而不会出现名称冲突。我认为解决方案是为每个版本的 SDK 创建 2 个静态库,然后将这些库导入 DLL。但是这个解决方案工作起来很奇怪,我不确定为什么....

简化的情况是这样的:

LIB1 - 函数 Add1 使用 SDK 1.0 中的东西

LIB2 - Add2 函数使用了 SDK 2.0 中的东西

DLL- 导入 LIB1 和 LIB2 并且有调用 Add1 或 Add2 的函数 Add( float 版本)- 取决于参数中的版本号

编译过程正常,但 DLL 仅适用于一个版本的 SDK :(

当我调试它时,我看到程序从参数为 2.0 版的 DLL 调用 Add 函数。然后 Add 真的调用了 Add2 - 所以这仍然是正确的。但是然后在 Add2 函数中它使用了 SDK 1.0 而不是 SDK 2.0 中定义的东西! LIB2 是真正用 SDK 2.0 创建的。 (include 目录和 lib 目录设置为 SDK 2.0)

那么为什么它使用 SDK 1.0 ??? :(

是不是因为链接器在我创建 DLL 时将所有内容连接在一起,而来自 SDK 1.0 的符号覆盖了来自 SDK 2.0 的符号??? (没有不同的命名空间)。

你知道问题出在哪里吗?有什么解决办法吗???

非常感谢!

我使用 Visual C++ 2010...

最佳答案

您观察到的行为可能是由库在链接器选项中列出的顺序引起的。尝试以相反的顺序列出它们,您可能会观察到“相反”的行为。

我认为您无法像这样混合搭配具有相同符号的库。您最好的选择是将至少一个库(或两个库)包装在单独的 DLL 中,这样可以将不同的符号暴露给您的“客户端”DLL(即不同的 namespace 甚至不同的名称)。

关于c++ - 静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com