【问题标题】:Force system QT libraries to use openssl libraries shipped with the application强制系统 QT 库使用应用程序附带的 openssl 库
【发布时间】:2017-06-29 00:51:41
【问题描述】:

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

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

my_app_exeQSslSocket::sslLibraryVersionString()返回1.0.2l,表示其使用系统openssl版本。

我能否强制 QT 库以某种方式使用随我的应用程序一起提供的 openssl?

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

约束:

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

my_app_exe 已经使用了RPATH,它指向随附的 openssl 所在的当前目录。

【问题讨论】:

  • 如果:QString sysLibPath = qgetenv("LD_LIBRARY_PATH"); qputenv(myLibPath + ":" + sysLibPath);main() 之前QApplication 构造?以防上述解决方案无法满足。
  • @AlexanderVX 试过了,但我无法让它工作,它仍然从旧位置加载
  • 这似乎是 Qt 库在某些预建路径中引用 SSL 库。实际上可以将 Qt 配置为使用 SSL 进行构建。
  • 我无法更改用户系统上的 QT。

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


【解决方案1】:

在 Debian 9 上,如果我使用 QLibrary 调用预加载(将它们作为 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 对我不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多