来自 Qt Creator 的应用程序 运行 使用的库与其 运行 单独使用时不同

App run from Qt creator uses different library than when its run on its own

当使用 QT Creator 中的 运行 按钮启动应用程序时,我必须使用 sftp 上传文件,它工作正常。

我发现当 运行 在它自己的应用程序上 returns 错误 1 ​​即 CURLE_UNSUPPORTED_PROTOCOL

curl -V 检查我的 osx 上的 curl 显示默认 curl 没有列出 sftp。

然而 QT creator 运行s 应用程序在一些不同的上下文中使用支持 sftp 的 curl,因为它上传文件没有错误。

所以问题是如何使独立应用程序使用与 QT Creator 运行 时相同版本的 dylib?

选项 A) 更改库路径

  • 使用 ps ax | grep <appname>
  • 查找应用程序 运行
  • 执行 otool -L <full-path-of-app>,这会给你 dylib 你的应用解析为
  • 使用 install_name_tool. 更改二进制文件中的 dylib 以指向 QT 创建者使用的 dylib

选项 B) [un]/set RPATH

您的应用程序使用不正确路径的另一个原因可能是您的 dylib 上的 RPATH。您可以使用 otool -l <full-path-of-your-app> 在您的 dylib 上检查 RPATH。 RPATH 告诉您位置二进制文件将首先从中获取库,如果它在您的应用程序中设置,您可以取消设置 RPATH 由 QT 创建者设置。

检查 man page of dyld 了解 RPATH 是如何工作的。

例如检查 RPATH 设置在 Xcode 应用程序上(您正在寻找 dylib 部分中的 LC_RPATH 字段)。

$ otool -l /Applications/Xcode.app/Contents/MacOS/Xcode 
Load command 22
          cmd LC_RPATH
      cmdsize 48
         path @executable_path/../Frameworks (offset 12)
Load command 23
          cmd LC_RPATH
      cmdsize 56
         path @executable_path/../SharedFrameworks (offset 12)
Load command 24
          cmd LC_RPATH
      cmdsize 40
         path @executable_path/../PlugIns (offset 12)

要取消设置 RPATH 使用 install_name_tool -delete_rpath <RPATH-from-otool-l-output>

QT creator 通常使用其软件包附带的库,而在您的目标系统上通常不存在这些库。更好的做法是编译 curl 并随您的应用程序一起发布