macdeployqt和第三方库

ran*_*836 12 deployment qt macdeployqt

我有一个应用程序项目依赖于我自己创建的几个共享库.根据Qt 4.6文档"在Mac OSX上部署应用程序":

注意:如果您希望第三方库包含在应用程序包中,则必须将该库的一个重复的lib条目添加到应用程序的.pro文件中.否则,macdeployqt工具不会将第三方.dylib复制到捆绑包中.

我已经将lib条目添加到我的应用程序的.pro文件中,但是当我执行macdeployqt时,我编写的库不会被复制到bundle中.我的.pro文件中有以下内容:

LIBS += -L../Libraries -lMyLib
Run Code Online (Sandbox Code Playgroud)

一切都建立好,就在我尝试从捆绑运行时遇到问题,即"图像未找到"错误.

macdeployqt中是否有错误或者我的.pro文件还有什么问题?

Chr*_*uns 17

badcat是正确的,Qt 4.6文档对macdeployqt工具的可能性有一个非常夸张的看法.

根据我的经验,macdeployqt所做的唯一事情是:

  1. 将Qt库复制到foo.app/Contents/Frameworks/目录中的应用程序包中
  2. 调整一个二进制文件的链接库,即foo.app/Contents/MacOS/foo(必须与app bundle同名,即使你在Info.plist中提到另一个二进制文件)

因此,对于要在应用程序包中部署的每个其他二进制文件和库,必须执行以下操作:

  1. 运行macdeployqt以享受其有用但无力的好处

    macdeployqt <path_to_your_nascent_app_bundle>/foo.app

  2. 手动安装额外的库

    cp <original_library_path> foo.app/Contents/Frameworks/<lib_name>

  3. 找出每个二进制文件链接到哪些库.

    otool -L <binary_file_name>

  4. 更改二进制文件中的内部库路径

    install_name_tool -change <original_library_path> @executable_path/../Frameworks/<lib_name> <binary_file_name>

我编写了一个perl脚本,可以为我的应用程序自动执行这些步骤,但是对于我的特定环境来说,这里发布的内容有点过于具体.


Iva*_*van 5

您无需关心第三方库的手动部署。我正在向 Qt 上传一个补丁,它可以指定额外的库搜索路径,以便 macdeployqt 工具找到第三方依赖项:https ://codereview.qt-project.org/#change,47906

在此之后,将有另一个提交,将添加对第三方库部署的支持。


Bas*_*Ben 1

您是否检查了 .app 捆绑包以查看这些库是否真的不存在?

如果是这种情况,我认为 macdeployqt 中确实存在错误,或者它根本找不到您正在链接的库。就我个人而言,我从未见过 macdeployqt 实际上将任何所需的第 3 方库复制到捆绑包中。

有趣的是macdeployqt永远不会直接使用 .pro 文件。它只是对生成的应用程序包执行一些操作。快速浏览一下文档后,这个Qt 4.7 文档页面显然证明了我的正确性:

注意:如果您希望将第 3 方库包含在应用程序捆绑包中,则必须在创建捆绑包后手动将库复制到捆绑包中。

我认为 4.6 文档中存在错误。对我来说,macdeployqt从未在我的包中放置任何库文件(当然,Qt* 除外)。

我过去确实花了很多时间在这些东西上,最后编写了一个简单的小(Python)脚本,它将所有内容打包到我的包中,根据需要更改库名称,并将所有内容放入带有自动命名的 .dmg 文件中。

可能不是您想听到的,但它确实有效。;)