考虑一个场景,其中有两个不同版本的共享库。考虑 A.1.so 链接到 B.so 和 A.2.so 链接到 C.so。现在 B.so 和 C.so 都链接到 d.exe 。当 B.so 想要调用 A.1.so 中的函数时,它最终调用了 A.2.so 中的函数。因此,它给了我们未定义的行为。
现在我希望我的 B.so 只调用 A.1.so。我只能修改 A.1.so 和 B.so ,没有别的。使用 dlopen()
是一种选择,但要使用 dlopen()
,我必须对 B.so 进行重大更改。 Stack Overflow 前面给出了很多解决方案,但似乎都没有用。请注意,我只能在 A.1.so 和 B.so 中更改代码。
除了 dlopen()
之外,是否还有其他解决此问题的方法。我在下面提到了一些链接。
- https://blog.habets.se/2012/05/Shared-libraries-diamond-problem.html
- https://code.woboq.org/qt5/qtbase/src/network/ssl/qsslsocket_openssl_symbols_p.h.html
- https://www.mailerq.com/blog/good-reasons-to-use-dlopen
- Loading multiple shared libraries with different versions
- Program use two conflicting shared libraries
- C++ two libraries depend on same lib but different versions?
- Linking with multiple versions of a library
- C++ two libraries depend on same lib but different versions?
最佳答案
你能把A1.cpp
中的所有代码包装在namespace A1
中,并添加一个using namespace A1
到B.cpp
?
通过 A1.cpp
和 B.cpp
我的意思是 A1.so
和 B.so
的所有相关翻译单元>.
关于c++ - 应用程序中两个不同版本的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947406/