c++ - 从 Qt Creator 运行的应用程序使用的库与其单独运行时不同

标签 c++ macos curl qt-creator dylib

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

我发现当在其自己的应用程序上运行时返回错误 1,即 CURLE_UNSUPPORTED_PROTOCOL

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

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

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

最佳答案

选项 A) 更改库路径

  • 使用 ps ax | grep <appname> 查找正在运行的应用程序
  • otool -L <full-path-of-app> ,这会给你 dylib您的应用解析为
  • 更改 dylib在你的二进制文件中使用 install_name_tool . Check this answer for more details指向dylib由 QT Creator 使用。

选项 B) [un]/set RPATH

您的应用使用错误路径的另一个原因可能是 RPATH在你的 dylib .你可以查看RPATH在你的 dylib 上使用 otool -l <full-path-of-your-app> . 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并随您的应用程序一起发送

关于c++ - 从 Qt Creator 运行的应用程序使用的库与其单独运行时不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46143358/

相关文章:

c++ - 如何监控文件的变化?

c++ - 使用位掩码组合枚举值

c++ - 用于 C++ 多平台项目的工具

swift - 无法使用 Swift 4 包管理器导入包

C:通过HTTP请求上传文件到Google Drive的错误408响应

php - CURL 结果放入 PHP 数组?

c++ - 拥有同名库的静态和动态版本是一种常见的做法吗?

macos - 从 CGImageRef 获取 NSImage

macos - 如何从可恢复的 NSWindow 中排除某些 AppKit View ?

json - CouchDB View 在使用 key、startkey 时抛出无效的 UTF-8 JSON 错误