3

我的应用程序 = 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.2lfor QSslSocket::sslLibraryVersionString(),表示其使用系统 openssl 版本。

我可以强制 QT 库以某种方式使用与我的应用程序一起提供的 openssl 吗?

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

约束:

  • 无法重新编译系统上存在的 QT 库
  • 无法与应用程序一起发布 QT 库
  • 无法更改系统 QT 库上的 RPATH

my_app_exe已经使用RPATHwhich 指向随附的 openssl 所在的当前目录。

4

1 回答 1

4

QLibrary在 Debian 9 上,如果我使用调用预加载(将它们作为 main() 中的第一件事加载),我能够加载正确的 SSL 和 Crypto 库。这正是 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

顺便说一句,设置LD_LIBRARY_PATH对我不起作用。

于 2017-07-07T23:15:34.517 回答