我正在开发 Linux/C++ 应用程序,我想使用 Microsoft ODBC 驱动程序 (
libmsodbcsql.so
)
启动时,我的应用程序由于与 libssl 冲突而崩溃。经过调查,我意识到:
libssl.so.1.0.0
;这是完全正常的:
libssl.so.1.0.0
在我的LD_LIBRARY_PATH
libssl.so.1.1
...可以说远不那么完全正常
libssl.so.1.1
根本不属于我的LD_LIBRARY_PATH
从版本 17.4 开始,驱动程序动态加载 OpenSSL,这使得它可以在版本 1.0 或 1.1 的系统上运行,而无需单独的驱动程序文件。从版本 17.9 开始,驱动程序除了以前的版本之外还支持 OpenSSL 3.0。 当存在多个版本的 OpenSSL 时,驱动程序将尝试加载最新版本。
...
如果使用驱动程序(或其组件之一)的应用程序链接或动态加载不同版本的 OpenSSL,则可能会发生潜在冲突。如果系统上存在多个版本的 OpenSSL 并且应用程序使用它,强烈建议您格外小心,确保应用程序加载的版本和驱动程序不会不匹配,因为这些错误可能会损坏内存,从而导致不一定会以明显或一致的方式表现出来。
使用
strace
,我可以看到驱动程序搜索所有Linux系统,找到最近安装的libssl,而不关心LD_LIBRARY_PATH
中指定的内容!!!
我现在正在寻找绕过此机制的正确方法?这可能是:
libssl.so.1.1
-...(当然我不想通过删除
libssl.so.1.1
来改变我的系统(和任何客户端系统)
感谢您的帮助
我的应用程序加载
我的应用程序也加载了libssl.so.1.0.0
libssl.so.1.1
这行不通(正如您所发现的)。您已将您的应用程序与“不兼容”库链接。要解决此问题,您必须链接到一组兼容库(即所有依赖项必须依赖于任一libssl.so.1.0.0
或
libssl.so.1.1
)。
LD_LIBRARY_PATH
之外
LD_LIBRARY_PATH
可能会改变加载程序查找库的
位置,但它不会改变正在搜索的库。让加载程序找不到
libssl.so.1.1
不会为您解决任何问题 - 加载程序只会失败并出现 libssl.so.1.1 not found
错误。