记录移植过程中的问题和解决过程:
1、svn取消不需要版本控制的文件:
安装zlib依赖包:
brew install zlib
安装的时候终端提示:
brew: command not found
解决办法是执行:
ruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
3、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上安装程序更普遍的方式是拖动安装包到“安装程序”然后程序就出现在启动台,可以从启动台运行程序。可参考:
生成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