13

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

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

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

LIBS += -L../Libraries -lMyLib

一切正常,只是当我尝试从我遇到问题的捆绑包中运行时,即“找不到图像”错误。

macdeployqt 中是否存在错误,或者我的 .pro 文件是否需要更多内容?

4

4 回答 4

21

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 脚本,为我的应用程序自动执行这些步骤,但它对于我的特定环境来说有点过于具体,无法在此处发布。

于 2011-07-14T18:14:53.097 回答
5

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

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

于 2013-03-16T08:15:06.893 回答
1

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

如果是这种情况,我会假设 macdeployqt 中确实存在错误,或者它根本无法找到您正在链接的库。就我个人而言,我从未见过 macdeployqt 实际上将任何需要的 3rd-party 库复制到包中。

有趣的部分是macdeployqt从不直接使用 .pro 文件。它只是对生成的应用程序包做一些事情。在快速浏览文档之后,这个Qt 4.7 文档页面显然证明了我是对的:

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

我假设 4.6 文档中存在错误。对我来说,macdeployqt从来没有在我的包中放置任何库文件(当然除了 Qt* 的)。

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

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

于 2010-11-20T11:40:42.903 回答
0

https://github.com/auriamg/macdylibbundler

dylibbundler 是一个小型命令行程序,旨在使捆绑 .dylib 尽可能简单。它会自动确定您的程序需要哪些 dylib,将这些库复制到应用程序包中,并修复它们和可执行文件以准备分发……所有这些都在终端上使用一个命令!如果您的程序使用具有依赖关系的插件,它也将起作用。

于 2014-08-15T19:28:27.977 回答