在 Mac OSX 上重定位后修补 Qt 二进制文件的脚本

Posted

技术标签:

【中文标题】在 Mac OSX 上重定位后修补 Qt 二进制文件的脚本【英文标题】:Script to patch Qt binaries after relocation on Mac OSX 【发布时间】:2013-07-24 10:45:08 【问题描述】:

我正在从源代码构建 qt 5。我想知道在 MacOS 下复制粘贴 qt 二进制文件的最简单方法是什么。如果您在任何 qt 框架上运行 otool,您将看到所有依赖项都使用绝对路径:

    bash-3.2$ otool -L QtWidgets 
QtWidgets:
    /Users/../Qt/qt5/qtbase/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.1.0, current version 5.1.1)
    /Users/../Qt/qt5/qtbase/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.1)
    /Users/../Qt/qt5/qtbase/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.1)
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 155.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 65.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.18.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.16.0)
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 45.0.0)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1187.37.0)

当我复制 qt 二进制文件并将我的应用程序与该副本链接时,它可以工作,但一些依赖框架是从旧位置获取的。当我尝试将二进制文件移动到另一台机器时,情况变得更糟。我知道可以使用 install_name_tool 解决问题,但这是很多容易出错的手动工作。我想知道是否有一个脚本可以帮助我?

【问题讨论】:

可能工作:ynniv.com/blog/2006/02/… 链接另一个很好的答案:***.com/a/17640221/110118 【参考方案1】:

在网上搜索了很久。我发现Qt Installer Framework 有必要的代码来修补 Mac OSX 下重新定位的 Qt 二进制文件。运行该代码有一个小问题,它是用 C++ 编写的,编译起来并不容易,因为我使用 Qt5.1 时它依赖于 Qt4。幸运的是,事实证明所有操作都可以通过命令行进行。 要使用该命令,您需要使用 Qt Installer Framework 创建的任何安装程序(Mac OSX 的 Qt 二进制安装程序就足够了)并使用以下命令:

./qt-mac-opensource-5.1.0-clang-offline.app/Contents/MacOS/qt-mac-opensource-5.1.0-clang-offline --runoperation "QtPatch" "mac"
"/Path/to/Qt/binaries/which/need/to/be/patched" "qt5"
========================================
Operation was successfully performed.

如果您收到“qmake 不是程序”或类似内容的错误消息,请尝试 chmod qmake:

chmod 777 qmake

注意:这适用于任何 QtIFW 安装程序。玩弄prebuilt version of QtIFW

好的,就是这样,这是迄今为止我发现的最直接的方法。

【讨论】:

【参考方案2】:

如果您仍然从源代码构建 QT5,那么静态链接将解决您的一些问题。

列出的原始链接已损坏。

要静态构建 QT,请在运行 ./configure 时将 -static 添加到参数中,例如

./configure -prefix /Developer/qt -qt-zlib -qt-libpng -qt-libjpeg -universal -sdk /Developer/SDKs/MacOSX10.4u.sdk -static -release

编译:make sub-src

安装:sudo make install

【讨论】:

链接好像坏了 已删除损坏的链接并直接添加信息。

以上是关于在 Mac OSX 上重定位后修补 Qt 二进制文件的脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OSX 上安装 Qt 的调试版本

通过 Qt (mac - OSX) 的 AWS 查询没有得到任何结果

如何在 Mac OSX 上将 DCMTK 与 Qt 链接

在 Mac osx 下将 OpenGL 链接到 Qt Creator

Mac OSX 10.9 上的 Qt 部署

Qt/C++ 在 Mac OSX 10 上将系统范围 QSettings 存储在哪里?