Windows系统程序移植到Mac的过程记录

记录移植过程中的问题和解决过程:

1、svn取消不需要版本控制的文件:

2、在Mac上编译QuaZip

安装zlib依赖包:

brew install zlib

安装的时候终端提示:

brew: command not found

解决办法是执行:

ruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3、Mac系统的程序路径后面带着一串,如下:

右键应用程序,“显示包内容”,进入真正的路径。 

4、mac下如何复制文件路径

5、重头戏,程序打包。(假设程序名称为helloWorld.app)过程如下:

  • 把整个程序包拷到另一个文件夹
  • 导入Qt库文件,在终端执行:/Users/zhangsan/Qt5.12.2/5.12.2/clang_64/bin/macdeployqt /Users/zhangsan/R7/helloWorld.app
  • 然后双击程序包,发现还是运行不起来,弹窗报错说的是有一些库文件未载入。在终端执行:otool -L /Users/zhangsan/testAPP/release/helloWorld.app/Contents/MacOS/helloWorld此命令可以查看主程序运行所需要的库文件情况。
  • 上图可见主线程关联的部分库文件的路径不在运行路径。在helloWorld.app/Contents/Frameworks 文件夹新建一个文件夹,名称为lib。将这些库文件全部复制到此文件夹下。然后执行指令:install_name_tool -change "库名称.1.dylib" "@rpath/lib/库名称.1.dylib" /Users/zhangsan/helloWorld.app/Contents/MacOS/helloWorld 将这些库文件路径设为lib目录
  • 然后再双击程序,发现还是运行不起来。原因是我这个程序比较复杂,上面的那些库文件构建的时候有相互包含的情况。库文件B构建的时候用到了库文件A,这时候就需要针对库文件B设置库文件A的路径。
  • 执行:otool -L /Users/zhangsan/helloWorld.app/Contents/Frameworks/lib/库文件.1.dylib 可以查看库文件所需的其他库文件情况,然后像上面一样执行 install_name_tool 指令修改关联库文件位置。

6、打包成安装包,执行:/Users/zhangsan/Qt5.12.2/5.12.2/clang_64/bin/macdeployqt /Users/zhangsan/helloWorld -dmg

7、上一步达成的包是直接运行的。Mac上安装程序更普遍的方式是拖动安装包到“安装程序”然后程序就出现在启动台,可以从启动台运行程序。可参考:

Mac打包dmg文件(更换背景图) 

MacOS下打包QT应用程序为DMG包

生成DMG包的操作:磁盘工具->选中新添加的映像->右键选择“xxx的映像”->储存。

8、上面的打包步骤太繁琐,每次修改程序都这么干的话太麻烦,可以写成shell脚本处理。如下:

echo "------开始处理------"

appRealPath=/release/helloWorld.app/Contents/MacOS
appPath=/release/helloWorld.app/Contents/MacOS/helloWorld
pakegePath=/release/helloWorld.app
appRpath=/release/helloWorld.app/Contents/Frameworks
licensePath=/release/helloWorld.app/Contents/MacOS/license.lic

Cur_Dir=$(pwd) #当前路径

appFullPath=${Cur_Dir}${appPath} #app完整路径
pakegeFullPath=${Cur_Dir}${pakegePath}
appFullRealPath=${Cur_Dir}${appRealPath}

/Users/zhangsan/Qt5.12.2/5.12.2/clang_64/bin/macdeployqt ${pakegeFullPath}

liceseFullPath=${Cur_Dir}${licensePath}
if test -e ${liceseFullPath}
then
    rm ${liceseFullPath}
fi

appFullRpath=${Cur_Dir}${appRpath}
libPath="${appFullRpath}/lib"

if [ -d ${libPath} ]; 
then
    rm -r ${libPath}
fi

mkdir ${libPath}

libIndex=0
for filePath in ${appFullRealPath}/*;
do
    fileName=`basename ${filePath}` #从文件的绝对路径提取文件名
    if [[ "$fileName" =~ ^lib.* ]];  #文件以lib开头
    then
         libFileList[libIndex]=${filePath}
         libFileNameList[libIndex]=${fileName}
         libIndex=`expr ${libIndex} + 1`
    fi
done

for index in "${!libFileList[@]}";
do
    destFullPath="${libPath}/${libFileNameList[index]}"
    libIndex=`expr ${libIndex} + 1`
    cp -f ${libFileList[index]} ${destFullPath}
#     echo "目标文件:${destFullPath}"
#     echo "源文件:${libFileList[index]}"
done

#主程序库配置
install_name_tool -change "libquazip.1.dylib" "@rpath/lib/libquazip.1.dylib" ${appFullPath}
install_name_tool -change "libjsoncpp.1.dylib" "@rpath/lib/libjsoncpp.1.dylib" ${appFullPath}
install_name_tool -change "libcomment.1.dylib" "@rpath/lib/libcomment.1.dylib" ${appFullPath}
install_name_tool -change "libprotocol.1.dylib" "@rpath/lib/libprotocol.1.dylib" ${appFullPath}
install_name_tool -change "libprodoc.1.dylib" "@rpath/lib/libprodoc.1.dylib" ${appFullPath}
install_name_tool -change "libcrypt.1.dylib" "@rpath/lib/libcrypt.1.dylib" ${appFullPath}

#libprodoc.1.dylib配置
prodocFullPath="${libPath}/libprodoc.1.dylib"
install_name_tool -change "libcomment.1.dylib" "@rpath/lib/libcomment.1.dylib" ${prodocFullPath}
install_name_tool -change "libprotocol.1.dylib" "@rpath/lib/libprotocol.1.dylib" ${prodocFullPath}
install_name_tool -change "libquazip.1.dylib" "@rpath/lib/libquazip.1.dylib" ${prodocFullPath}
install_name_tool -change "libcrypt.1.dylib" "@rpath/lib/libcrypt.1.dylib" ${prodocFullPath}

echo "------处理完成------"

这个脚本处理的操作就是第5步的所有操作。

9、安装后发现无法定位当前目录,解决办法:

QDir::currentPath()

改成:

QCoreApplication::applicationDirPath()

10、png转苹果icns格式图标网站:cloudConvert。 

11、Mac上命令行打开可执行程序:

open ./helloWorld.app
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
理解Microsoft专家认证程序 理解Microsoft认证的不同等级和类型 选择成为MCP(Microsft认证专家)的考试科目 选择成为MCSD的考试科目 选择成为MCT的考试科目 MCSE认证考试的科目 选择合适的MCSE课程组合 核心课程考试 选修课程考试 考试编号的识别 课程内容和考试内容的对照 理解微软的MCSE长远考虑 理解微软出题的方式 使用本书帮助备考 在Internet上寻找对考试有帮助的信息 寻求微软认可的课程指导 寻找高质量的和三方帮助 寻找可利用的评估软件拷贝 报名参加考试 考试的费用问题 考前的自我调整 使用考试中心提供的考试工具 参加模拟测试 熟悉使用计算机进行考试 充分利用考试时间 考题的形式 理解多重选择题型 理解对错题题型 理解多重选择多重答案题型 理解基于解决方案型的问题 理解“建议方法”类型的考题 分析考试结果 准备重新考试 合理安排考试课程的顺序 熟悉Windows系列产品 比较Windows NT Server和NT Workstation 比较Windows NT Workstaton和Windows 95 在Windowx 95和Windows NT Workstation之间作出选择 关于Microsoft Windows NT的70-069号考试:实现和支持Microsoft Windows NT Server 4.0 70-069号考试(实现和支持Microsoft Windows NT Server 4.0)覆盖的内容 Windows NT 4.0界面简介 Windows NT 4.0任务栏(taskbar)的使用 Windows NT回收站简介 Windows NT帐号简介 理解单域模型支持和帐号数量 安全认证号简介 使用管理向导(Administrative Wizards)创建帐号 使用Server Manager(服务器管理器)程序创建计算机帐号 Userver Manager for Domains(域的用户管理器)简介 使用User Mnager for Domains创建用户帐号 刷新用户帐号列表 用户帐号列表的排序 事件查看器(Event View)程序简介 筛选Event Viewer中的事件 授予用户在本地登录的权利 使用Windows NT诊断程序查看系统配置 激活“Windows NT Security(Windows NT安全)”对话框 理解登录验证过程 理解访问令牌(Access Token) Windows NT目录服务简介 理解Windows NT如何构造用户帐号数据库 使用Windows NT中的Ctrl+Alt+Del组合键 把Windows NT计算机设置成自动登录 改变Windows NT口令 用拨号网络登录 复制用户帐号 为简化多个帐号的创建工作而建立用户帐号模板 删除和重新命名用户帐号 理解保护缺省的Administrator帐号的重要性 重新命名管理员帐号 理解缺省的Guest帐户 Windows NT在哪里创建帐号 设置口令限制条件 设置用户登录地点 创建宿主文件夹 设置用户登录时间 创建临时用户帐号 重新设置用户帐号口令 修改多个用户帐号 自动注销有时间限制的用户 要求用户在下次登录时改变口令 设置帐号规则 设置用户口令永不过期 停用用户帐号 解开登录失败后的用户帐号 Windows NT组简介 理解用户权限和组的访问权限 理解用户和组的权利 分清权限(permission)和权利(right) 设置组成成员关系 理解全局帐号 理解本地帐号 定义Everyone组 Network组的详细说明 Inteactive组的详细说明 Administrators组的详细说明 Guest组的详细说明 Users组的详细说明 Print Operators组的详细说明 Backup Operators(帐户操作员)组的详细说明 Replicator(复制员)组的详细说明 Domain Guests(域客户)组的详细说明 Domain Users(域用户)组的详细说明 Domain Admins(域管理员)组的详细说明 赋予拨号进入权限 理解用户配置文件(User Profile) 为Windows用户创建并使用登录脚本文件(Logon Script) 创建漫游式用户配置文件(Roaming User Profile) 创建强制性用户配置文件(Mandatory User Profile) 为用户帐号分配一个配置文件 创建帐户时变量的使用 创建随机初始化口令 理解内建组(Built-in Group) 理解组和策略 设置主组(Primary Group) 理解删除一个组的影响 域控制器(Domain Controller)简介 成员服

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值