2

我或多或少有一种情况,如此处所示;它存在于 Windows 和 Linux 上,但我将使用更清晰的 Linux 表示法来绘制它: 在此处输入图像描述

libbar.so.1 和 libbar.so.2 包含具有相同名称和签名但行为不同的过程。如果我“天真地”链接应用程序,那么最后加载的库中的符号将“隐藏”首先加载的库中的符号(至少,如果我正确理解了这个引用),我无法同时使用这两个库同时确定当天实际使用了哪个库的符号。

当然,我在运行时收到的错误消息与这种心理模型是一致的。

现在,如果我可以重新编译所有库,那么如参考中所述,我可以使用该–default-symver选项(至少在使用 gcc 编译和链接时)来完全消除每个库中的符号歧义,并强制 libfoo.so 查找功能baz@@libbar.so.1和应用程序来寻找baz@@libbar.so.2没有歧义的功能。

但是,如果我只能重新编译我的应用程序和 libbar.so.2 怎么办?libfoo.so 是否会忽略该函数baz@@libbar.so.2,或者它只会看起来只是它的baz一部分,并且可能仍然使用它而不是 libbar.so.1 中的那个?

这是一个完整的跨平台应用程序,所以我在 Windows 上也有完全相同的问题要解决。在这里,我有一个暗示,我可以使用 SxS 机制,因为情况与在 VS2019 中编译的应用程序链接到在 VS2013 中编译的库并没有什么不同;这样应用程序需要链接到运行时的一个版本,而库需要链接到另一个版本。但是,虽然我知道如何使用系统库来处理这个问题,但我不太确定如何使用其他库。

4

0 回答 0