Mac下使用macdeployqt打包qt程序:

概述

初次在Mac上使用qt的macdeployqt来打包生成的可执行程序,这里记录下。由于我的程序是调用之前生成的qt动态库,而动态库又依赖于第三方库,相对于没有库文件依赖的程序,这里有一些需要注意的点,下面是打包的步骤。

打包步骤

使用macdeployqt打包qt程序:
1.项目设置为release模式,编译并运行生成release下的可执行程序;
2.将1中生成的可执行程序,存入一个空的文件夹下;
3.在终端zsh中进入到qt安装目录下,找到macdeployqt,并cd到macdeployqt所在的目录下;
我的macdeployqt所在的目录是:/Users/admin/Qt/6.2.2/macos/bin/macdeployqt
4.执行指令:./macdeployqt xxx.app;
这里所在的目录是macdeployqt所在目录,所以需要可执行程序的绝对路径,即完整路径,此处输入指令:
./macdeployqt /Users/admin/Documents/qt-program/dll-testDll/testDll.app;
可执行程序中要是使用了qml模块,则相应的打包指令变为:macdeployqt xxx.app -qmldir=xxx/xxx/xxx/xxx/,
其中xxx.app使用的绝对路径,-qmldir的赋值是qml文件所在的路径,这里指出qml文件所在的文件夹路径即可,
如我的程序里使用了qml则输入的指令为:./macdeployqt /Users/admin/Documents/qt-program/dll-testDll/testDll.app -qmldir=/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/controls/,我的电脑是m1芯片,在使用macdeployqt打包程序的时候,会出现下面的输出:

ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtWidgets.framework/Versions/A/QtWidgets (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtGui.framework/Versions/A/QtGui (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtCore.framework/Versions/A/QtCore (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtQuickWidgets.framework/Versions/A/QtQuickWidgets (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtQuick.framework/Versions/A/QtQuick (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtOpenGL.framework/Versions/A/QtOpenGL (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtWidgets.framework/Versions/A/QtWidgets (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtGui.framework/Versions/A/QtGui (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtQmlModels.framework/Versions/A/QtQmlModels (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtQml.framework/Versions/A/QtQml (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtNetwork.framework/Versions/A/QtNetwork (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtCore.framework/Versions/A/QtCore (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/PlugIns/platforms/libqcocoa.dylib (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtGui.framework/Versions/A/QtGui (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtCore.framework/Versions/A/QtCore (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtGui.framework/Versions/A/QtGui (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Qt/6.2.2/macos/lib/QtCore.framework/Versions/A/QtCore (architecture arm64):"
ERROR: Could not parse otool output line: "/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/PlugIns/styles/libqmacstyle.dylib (architecture arm64):"

以上只是拷贝了其输出的一部分,第一次看到这个的时候,一直在纠结如何解决这个问题,后面发现即使看上去这个输出是有错误的,但是可执行程序依旧可以实现打包,此时可以双击打开,对于只是简单的可执行程序,没有依赖第三方库的程序,此时可以尝试双击打开可执行程序,也就是说这个显示有错误的输出不影响最终生成的可执行程序。
备注:若生成的可执行程序,没有调用第三方库,则按照上面1,2,3步骤便可以打包完成,双击运行;若是生成的可执行程序调用了动态库,则在1,2,3的基础上还需要再将库文件做相应的配置;
5.查看生成的可执行程序需要依赖的动态库。
终端zsh下使用指令otool -L xxx.app;这里使用可执行程序的完整的路径;
如我生成的可执行程序所在的路径为:/Users/admin/Documents/qt-program/dll-testDll/testDll.app,右键在testDll.app上出现右键菜单,选择查看文件内容,会出现文件夹Contents,进入后可以看到MacOS文件夹,在MacOS文件夹下是可执行程序testDll 。查看testDll 所依赖的动态库指令为:
otool -L /Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/testDll
可以看到:

 otool -L /Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/testDll 
/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/testDll:libtestAgoraVideoDll.1.dylib (compatibility version 1.0.0, current version 1.0.0)@rpath/QtWidgets.framework/Versions/A/QtWidgets (compatibility version 6.0.0, current version 6.2.2)@rpath/QtGui.framework/Versions/A/QtGui (compatibility version 6.0.0, current version 6.2.2)/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 2113.20.111)/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0)/System/Library/Frameworks/Metal.framework/Versions/A/Metal (compatibility version 1.0.0, current version 258.17.0)@rpath/QtCore.framework/Versions/A/QtCore (compatibility version 6.0.0, current version 6.2.2)/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1200.3.0)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.0.0)

以上是testDll所依赖的库文件,其中有些文件指明了路径,像/System/开头,/usr/开头的,一般是系统路径,会自动在这些路径下查找相应的库文件,无需考虑,@rpath为运行路径,因为我的可执行程序下的testDll.app在右键打开进入Contents文件夹下后可以看到如下:
请添加图片描述
其中Frameworks文件夹和Plugins文件夹是打包后生成的。Frameworks文件夹下存放的是可执行程序依赖于qt的一些库,Plugins指明了一些插件。由于之前通过otool -L查看了可执行程序testDll的依赖库,接下来将可执行程序调用的库文件libtestAgoraVideoDll.1.dylib,进行一些配置和放置。
6.修改libtestAgoraVideoDll.1.dylib的查找路径,使可执行程序在可执行程序所在的同级目录下查找ibtestAgoraVideoDll.1.dylib。
使用指令:
install_name_tool -change “libtestAgoraVideoDll.1.dylib” “@executable_path/libtestAgoraVideoDll.1.dylib” /Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/testDll
7.拷贝ibtestAgoraVideoDll.1.dylib库文件到可执行程序testDll所在的目录下;
请添加图片描述
8.由于程序调用了生成的库ibtestAgoraVideoDll.1.dylib,而ibtestAgoraVideoDll.1.dylib又依赖于第三方库,所以放置好ibtestAgoraVideoDll.1.dylib后还需要设置ibtestAgoraVideoDll.1.dylib依赖的第三方库的路径。
这里将ibtestAgoraVideoDll.1.dylib所依赖的第三方库文件拷贝到文件夹/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/Frameworks下;
9.程序调用生成的qt动态库,该动态库使用了qml文件来实现界面。
所以还需将qml文件做一些放置和配置;
该实现指令同上述的第4条提到的./macdeployqt /Users/admin/Documents/qt-program/dll-testDll/testDll.app -qmldir=/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/controls/,最好在第4条执行该语句,执行该语句前将生成动态库所需要的qml文件拷贝到路径/Users/admin/Documents/qt-program/dll-testDll/testDll.app/Contents/MacOS/controls/文件夹下。如果没有将用到的qml文件做配置和放置,会出现运行程序后只有一个白色的窗口。
9.以上打包一个调用依赖于第三方库生成的qt动态库的程序生成了。但是双击可执行程序不一定能正常运行,取决于有没有使用一些mac认为的比较敏感的数据,比如照相机,麦克风,通讯录之类,需要根据程序运行时出现的奔溃报告在info.plist文件中添加相应的key和value。我的程序添加的是照相机和麦克风。之后便能正常运行了。
在这里插入图片描述
info.plist中新加的内容如下:
在这里插入图片描述
以上是关于mac下使用qt打包程序的一点记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路透社:谷歌已停止与华为部分合作;联想否认断供华为PC;微软计划直供Linux内核;谷歌无人机快递Wing进军芬兰……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 阿里巴巴联合欧莱雅发布移动…

管理修改

现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。 你会问,什么是修改? 比如你新增了一行&#x…

npm install安装依赖报错——常见报错解决方案

小伙伴在开发前端项目过程中,执行npm install安装项目依赖时,往往会遇到各种各样的报错,接下来建仔给大家总结一下几种常见报错解决方案! 第一种报错:无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 报错详…

AWS CEO Andy Jassy 专访:我们一直思考的是未来 2-5 年的事 | 人物志

戳蓝字“CSDN云计算”关注我们哦!人物志:观云、盘点、对话英雄。以云计算风云人物为核心,聚焦个人成长、技术创新、产业发展,还原真实与鲜活!本文来源:Siliconangle《Exclusive interview: How CEO Andy Ja…

撤销修改

自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: Im writing a report.在你准备提交前,一杯咖啡起了作用,你猛然发现了stupid boss可能会让你丢掉这个月的奖金…

QtCreator下使用c++标准输入cin输出cout没有阻塞等待输入

引言 在QtCreator中编写c程序,其中需要从控制台输入,就用了c的cout和cin,本应该等待控制台输入文本,但是却没有。下面是具体的案例。 案例 本文基于QtCreator创建的qt控制台输出程序,创建时选择如下图所示的选项&am…

Docker 系列学习文章 | 什么是容器云?

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:宝哥devops运维转自:云加社区腾小云导读:容器…

删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: echo "test del file" >> test.txt git add test.txt git commit -m "add del test.txt"一般情况下,…

mvc设计模式的简单领悟

引言 mvc设计模式,是将数据模型与视图分离,通过控制器来建立起数据模型与视图之间的联系,当数据模型变化自动更新视图。其中M-数据模型,V-视图,C-控制器。下面是一个简单的对于MVC设计模式的使用。 示例 开发环境是…

添加远程库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得…

微服务精华问答 | 什么是金丝雀释放?

戳蓝字“CSDN云计算”关注我们哦!微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天,就让我们来看看关于微服务更加有深度的问题吧。1Q:什么是金丝雀释放?A:Canary Rele…

Git 远程配置

Git 配置篇02_远程配置 git 远程配置 2种方案 码云 Github 案例演示 码云 Github更改用户名和邮箱即可 任选1种 第1步:生成SSH key 输入下边命令一直回车(4次回车) ## 码云配置方案: ssh-keygen -t rsa -C "13396492261163…

虚拟器件—虚拟化技术的新利刃 | 时光机

戳蓝字“CSDN云计算”关注我们哦!时光机:搭载这部时光机,带您回顾《程序员》大量优秀文章,重温经典技术干货,我们发现硬核技术永不过时,对于get要点、solve难题、提高自我,仍有非凡意义。作者&a…

git从远程库克隆

首先,登陆GitHub,找到我们的learngit项目 第一种方式(老手建议):通过命令将远程仓库的代码,拉取到本地,文件夹形式。 第二种方式(入门建议):将远程的项目代码下载到本地,压缩包形式。 复制…

图解分布式架构的发展和演进 | 技术干货

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!编注: 架构决定的系统的稳定性,扩展性和并发性,架构的演进是从…

C++中链表反转2

引言 周期按我也写过类似链表反转的文章,这个链表反转是在第二次写的时候写的,由于都是靠当时的思路,两个在代码实现上有所差异,仅以记录。 示例 编程环境 在vs2010下编写的C控制台输出程序,文件名由main.cpp改为t…

阿里云PolarDB重大更新:两大技术突破,传统数据库一键迁移上云

5月21日,阿里云PolarDB发布重大更新,提供传统数据库一键迁移上云能力,可以帮助企业将线下的MySQL、PostgreSQL和Oracle等数据库轻松上云,最快数小时内迁移完成。据估算,云上成本不到传统数据库的1/6。目前,…

Spring精华问答 | Spring Bean的自动装配是怎么回事?

戳蓝字“CSDN云计算”关注我们哦!Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分J…

华为正准备发布属于自己的手机操作系统;腾讯已经交出了首张产业互联网成绩单……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 第二代Google Glass 企…

qt实现QLabel上显示的文字有描边

qt实现文字描边效果图开发环境项目示例综述效果图 此程序运行的效果。 开发环境 1.关于我的开发环境,我目前有点迷惑,我的QtCreator中帮助-》关于QtCreator,得到如下所示: 但是我的安装包上却写着5.12.9 我的理解就是qt版本是…