macdeployqt和第三方库

时间:2010-05-11 10:40:14

标签: qt deployment macdeployqt

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

  

注意:如果您想要第三方库   包含在您的申请中   捆绑,然后你必须添加一个明确的   该库的lib条目到你的   应用程序的.pro文件。除此以外,   macdeployqt工具不会复制   第三方.dylib进入捆绑。

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

LIBS += -L../Libraries -lMyLib

一切都建立好,就在我尝试从我遇到的问题中运行时遇到问题,即“图像未找到”错误。

macdeployqt中是否有错误,或者我的.pro文件中是否还有其他错误?

4 个答案:

答案 0 :(得分:16)

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

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

  1. 将Qt库复制到foo.app/Contents/Frameworks/目录中的应用包中
  2. 调整一个二进制文件的链接库,即foo.app/Contents/MacOS/foo(必须与app bundle同名,即使你在Info.plist中提到另一个二进制文件)
  3. 因此,对于要在应用程序包中部署的每个其他二进制文件和库,必须执行以下操作:

    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>

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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

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

  

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

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

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

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

答案 3 :(得分:0)

https://github.com/auriamg/macdylibbundler

  

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