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

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

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

Windows系统程序移植到Mac的过程记录_第1张图片

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此命令可以查看主程序运行所需要的库文件情况。Windows系统程序移植到Mac的过程记录_第2张图片
  • 上图可见主线程关联的部分库文件的路径不在运行路径。在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

你可能感兴趣的:(打包,移植,系统相关,windows,qt,mac,os,x,移植)