强制系统QT库使用随应用程序一起提供的openssl库

时间:2017-06-29 00:51:42

标签: c++ qt openssl qt5 qt5.7

我的应用程序= libssl.so(1.0.2f)+ libcrypto.so(1.0.2f)+ my_app_exe

在Debian 9上,QT版本为5.7,openssl为1.0.2l

my_app_exe会为1.0.2l返回QSslSocket::sslLibraryVersionString(),这意味着它使用系统openssl版本。

我可以强制QT库以某种方式使用我的应用程序附带的openssl吗?

我已尝试使用QCoreApplication::addLibraryPath(const QString &path)设置库路径,但QT库仍然会选择系统openssl版本。

约束:

  • 无法重新编译系统中存在的QT库
  • 无法随应用程序一起提供QT库
  • 无法更改系统QT库上的RPATH

my_app_exe已使用RPATH指向openssl所在的当前目录。

1 个答案:

答案 0 :(得分:3)

在Debian 9上,如果我使用QLibrary调用预加载(将它们作为main()中的第一个加载),我就可以加载正确的SSL和加密库。这正是QT库正在做的事情loadOpenSsl()

    int main()
    {
        QLibrary libcrypto, libssl;
        libcrypto.setFileNameAndVersion(QLatin1String("crypto"), QLatin1String(SHLIB_VERSION_NUMBER));    
        libssl.setFileNameAndVersion(QLatin1String("ssl"), QLatin1String(SHLIB_VERSION_NUMBER));

        ...<snipped>...
        return 0;
     }

请记住,我也在应用程序上设置了RPATH

$ objdump -x my_app_exe | grep -i RPATH
  RPATH                $ORIGIN/lib

加密库存储在./my_app_exe/lib/lib{ssl,crypto}.so

BTW,设置LD_LIBRARY_PATH对我不起作用。