关于链接和包含不同版本的库的问题
如果我有一个可执行文件和一个库使用不同的,这会是一个问题吗? 另一个库的版本。
示例:
如果我有一个可执行文件:A.exe,它基本上包装并依赖于 静态库 A.lib
A.exe 和 A.lib 都需要另一个库 B.lib
如果我遇到这样的情况:
A.lib 库包含 B.lib 版本 1(使用来自 这个图书馆) A.exe 可执行文件包含 B.lib 版本 2 A.exe 可执行文件链接到 B.lib 版本 2
在什么情况下会出现问题?
谢谢
Is it a problem if I have an executable and a library use different
versions of another library.
Example:
If I have an executable: A.exe, and it basically wraps and depends on
a static library A.lib
Both A.exe and A.lib need another library B.lib
If I have a situation like this:
The A.lib library includes B.lib version 1 (uses header files from
this library)
The A.exe executable includes B.lib version 2
The A.exe executable links against B.lib version 2
Under what conditions would this be problematic?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果 B1.Lib 和 B2.Lib 中都存在相同的函数,并且两者都链接到 A.exe,则可能会遇到问题。基本上,如果 B1::fn 返回与 B2::fn 不同的结果,并且 A.Lib 依赖于 B1 结果,而 A.exe 依赖于 B2 结果,那么您就会遇到严重问题。链接器只会链接到它找到的第一个实现,您不能 100% 确定它会在 B1 或 B2 中。
实际上,重写 A.lib 以使用 B2.lib 更安全。如果失败了,命名空间就是你的朋友......
If the same functions exist in both B1.Lib and B2.Lib and both are linked to A.exe you may end up with a problem. Basically if B1::fn returns different results to B2::fn and A.Lib relies on the B1 results and A.exe relies on the B2 results you have a MAJOR problem. The linker will just link to the first implementation it finds and you can't be 100% sure that will be in B1 or B2.
Realistically its far safer to re-write A.lib to use B2.lib. Failing that namespaces are your friend ...