我有一个应用程序项目依赖于我自己创建的几个共享库。根据Qt 4.6文档“在Mac OSX上部署应用程序”:
注意:如果您想要第三方库 包含在您的申请中 捆绑,然后你必须添加一个明确的 该库的lib条目到你的 应用程序的.pro文件。除此以外, macdeployqt工具不会复制 第三方.dylib进入捆绑。
我已经在我的应用程序的.pro文件中添加了lib条目,但是当我执行macdeployqt时,我写的库不会被复制到bundle中。我的.pro文件中有以下内容:
LIBS += -L../Libraries -lMyLib
一切都建立好,就在我尝试从我遇到的问题中运行时遇到问题,即“图像未找到”错误。
macdeployqt中是否有错误,或者我的.pro文件中是否还有其他错误?
答案 0 :(得分:16)
badcat是正确的,Qt 4.6文档对 macdeployqt 工具的可能性有一个非常夸大的看法。
根据我的经验,macdeployqt所做的唯一事情是:
因此,对于要在应用程序包中部署的每个其他二进制文件和库,必须执行以下操作:
运行macdeployqt以享受其有用但功效不足的好处
macdeployqt <path_to_your_nascent_app_bundle>/foo.app
手动安装额外的库
cp <original_library_path> foo.app/Contents/Frameworks/<lib_name>
找出每个二进制文件链接到哪些库。
otool -L <binary_file_name>
更改二进制文件中的内部库路径
install_name_tool -change <original_library_path> @executable_path/../Frameworks/<lib_name> <binary_file_name>
我编写了一个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,在应用程序包中复制这些库,并修复它们和可执行文件以便分发...所有这一切都只需要一个命令就可以了!如果您的程序也使用具有依赖项的插件,它也会起作用。