【问题标题】:App run from Qt creator uses different library than when its run on its own从 Qt 创建者运行的应用程序使用与单独运行时不同的库
【发布时间】:2018-02-18 23:12:14
【问题描述】:

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

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

curl -V 在我的osx 上检查curl 表明默认curl 没有列出sftp。

但是,QT creator 在某些不同的上下文中运行应用程序,该应用程序使用支持 sftp 的 curl,因为它上传文件时不会出错。

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

【问题讨论】:

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


    【解决方案1】:

    选项 A) 更改库路径

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

    选项 B) [un]/set RPATH

    您的应用使用不正确路径的另一个原因可能是您的dylib 上的RPATH。您可以使用otool -l <full-path-of-your-app> 在您的dylib 上检查RPATH。 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 并随您的应用程序一起发布

    【讨论】:

    • 实际上仍然不知道为什么会这样,因为当检查由 Qt 创建者运行的应用程序时,我通过单击应用程序图标运行的应用程序完全相同。但是指向 otool 和 install_name_tool 就足够了,所以我能够破解 curl 进入我可以交付的应用程序。静态构建不起作用,因为我必须静态构建 curl 及其依赖项。
    • @Mateusz 我根据我怀疑是你的情况更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多