从Qt创建者运行的应用程序使用不同的库,而不是它自己运行时

时间:2017-09-10 17:09:39

标签: c++ macos curl qt-creator dylib

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

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

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

然而,不知何故QT创建者在某些不同的上下文中运行应用程序,该上下文使用支持sftp的curl,因为它上传文件时没有错误。

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

1 个答案:

答案 0 :(得分:2)

选项A)更改lib路径

  • 使用ps ax | grep <appname>
  • 查找正在运行的应用程序
  • 执行otool -L <full-path-of-app>,这样您的应用就会dylib解析为
  • 使用install_name_tool更改二进制文件中的dylibCheck this answer for more details指向QT创建者使用的dylib

选项B)[联合国] /设置RPATH

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

检查man page of dyld,了解RPATH的工作原理。

例如,检查在Xcode应用上设置的RPATH(您正在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创建者通常使用随其软件包一起提供的库,而在目标系统上,这些库通常不存在。更好的做法是编译curl并随应用程序一起提供