打包工具介绍

Mac平台规范包可以使用Packages工具。下载地址

打包前准备工作

创建一个目录 macProject

macProject目录中是以下目录结构 myProject.app

└── Contents

├── Info.plist

├── MacOS

├── res

├── libmymath.dylib

├── Frameworks

└── Resources

├── wolf.icns

Info.plist : 主要描述的是一些工程的配置。具体字段解释

关键字类型说明CFBundleExecutableString可执行程序文件名。即与启动图标绑定的可执行程序CFBundleIconFileString图标文件文件名CFBundleIdentifierString应用程序唯一标识CFBundleNameString程序安装后在界面上显示的名称LSUIElementBoolean置为 true 可以将应用程序设置为无界面(UI-less)模式。这意味着应用程序在启动时不会显示任何窗口或图标,只会在菜单栏上显示一个小点LSBackgroundOnlyBoolean设置为 true 可以确保应用程序在后台运行,并且不会成为活动应用程序。

文件内容格式如下。如果没有特殊需求,使用以下字段就够用了。

CFBundleExecutable

res

CFBundleIconFile

AppIcon

CFBundleIdentifier

com.csdn.smallgraywolf

CFBundleName

smallgraywolf

Frameworks : 一般放置了此程序所使用的第三方 Framework,即动态库,以QT为例

比如QT的库默认会安装到这里 /opt/local/libexec/qt4/Library/Frameworks需要哪个,就把哪个拷贝到我们自己包中的Frameworks下,如果需要 QtCore,就把 QtCore.framework 这个目录全部拷贝过来 MacOS : 存放程序和我们自己的动态库,mac平台下动态库是dylib后缀Resources : 存放资源文件,可以将图标资源放在这里。图标资源格式必须是icns格式,可以直接在网页上将PNG格式或其他格式图片转为icns格式

打包

直接在用应用程序中双击打开Packages创建一个打包工程

1、选择Distribution,点击next,创建一个打包工程名MyPackage 2、点击MyPackage

2.1、Settings项:主要填写应用程序唯一标识符 Identifier和版本号 Version 2.2、Payload项:在Applications下面添加我们的应用程序,也就是刚才创建好的文件夹 myProject.app 2.3、Scripts项:需要添加两个文件preinstall(安装程序前执行的shell脚本命令)和postinstall(安装程序后执行的shell脚本命令)

这个根据需求添加,不需要的话不需要添加 3、文件选择完成后,点击菜单栏的build,在打包工程文件的同级目录下会生成一个build目录,build目录中会生成一个pkg安装包 到这里安装包就已经制作成功了 直接双击就可以安装 安装完成后,在应用程序中就可以找到我们的应用,直接双击图标就可以运行 在启动台中也能找到我们的安装程序 我们的程序会安装到这个目录下 /Applications/myProject.app

应用程序卸载

mac平台下卸载应用程序时,直接在应用程序中,右击图标,移到废纸篓即可

otool工具介绍

otool工具介绍

otool命令全称object file displaying tool,是针对目标文件的展示工具,可以帮助我们发现应用中使用了哪些系统库,以及调用了哪些对象的方法和属性。otool -L : 查看目标文件链接了哪些库otool -l : 查看目标文件的详细信息 mac平台下需要通过 install_name_tool 命令行工具设置rpath

添加rpath : install_name_tool -add_rpath <加载路径> <目标文件>删除rpath : install_name_tool -delete_rpath <加载路径> <目标文件>修改rpath : install_name_tool -change <原加载路径> <新加载路径> <目标文件>

可执行程序的rpath设置

直接编译完的程序,可以使用otool -L <可执行程序或动态库> 查看下依赖 root@GolddeMac-mini bin # otool -L res

res:

/opt/local/libexec/qt4/Library/Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)

/opt/local/libexec/qt4/Library/Frameworks/QtNetwork.framework/Versions/4/QtNetwork (compatibility version 4.8.0, current version 4.8.7)

/opt/local/libexec/qt4/Library/Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)

@rpath/libparson.dylib (compatibility version 0.0.0, current version 0.0.0)

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 905.6.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)

这里的rpath是没有值的,如果直接使用,会找不到相关依赖,比如 libparson.dylib需要在命令行设置下rpath, 以下这个命令表示设置res的rpath路径为当前路径 install_name_tool -add_rpath @executable_path res

这样设置后,只要把libparson.dylib拷贝到res所在目录,就可以找到该依赖了。使用 otool -l res 命令查看下,如果最后一行有下面这个,说明就设置成功了 path @executable_path (offset 12)

还没完,res依赖的Qt库在系统目录下,在没有Qt的Mac电脑上是找不到这个路径的,因此还要修改Qt的依赖路径 install_name_tool -change /Applications/kpki.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui @rpath/../Frameworks/QtGui.framework/Versions/4/QtGui ztaClient

这个路径 @rpath/…/Frameworks/QtGui.framework/Versions/4/QtGui 在哪里都可以,但是要保证安装后,在用户的电脑上能找到这个,依次再修改下 QtNetwork QtCore再查看依赖 root@GolddeMac-mini bin # otool -L res

res:

@rpath/../Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)

@rpath/../Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)

@rpath/../Frameworks/QtNetwork.framework/Versions/4/QtNetwork (compatibility version 4.8.0, current version 4.8.7)

@rpath/libparson.dylib (compatibility version 0.0.0, current version 0.0.0)

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 905.6.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)

Mac平台第三方库依赖设置

以Qt库为例, 在Linux平台, 只需要设置我们可执行程序的依赖即可, 不需要设置第三方库的依赖.比如ldd查看我们可执行程序的依赖 ldd res

libQtGui.so.4 => ./libQtGui.so.4 (0x00007fafd0f14000)

libQtNetwork.so.4 => ./libQtNetwork.so.4 (0x00007fafd0bcd000)

libQtCore.so.4 => ./libQtCore.so.4 (0x00007fafd06df000)

设置res的rpath为当前路径后,只需要将Qt相关库拷贝过来即可libQtGui.so.4是依赖于libQtCore.so.4的,查看依赖关系,可以看到libQtGui.so.4找不到依赖 ldd libQtGui.so.4

libQtCore.so.4 => not found

但是这并不影响我们程序的运行,因为libQtGui.so.4是根据主程序res去找依赖的,实际是可以找到的。但是!但是!在MAC平台就会出问题。使用 otool -L QtGui 查看依赖,QtGui依赖的QtCore路径是在系统目录下 otool -L QtGui

QtGui:

/opt/local/libexec/qt4/Library/Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)

/opt/local/libexec/qt4/Library/Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)

虽然我们已经指定了可执行程序的依赖,但是QtGui还是会找不到QtCore,因此必须还要指定QtGui的依赖, 让QtGui能找到QtCore,否则安装到没有Qt的Mac电脑上就会报错 otool -L QtGui

QtGui:

/opt/local/libexec/qt4/Library/Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)

/Applications/res.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)

因此在Mac平台,只要可执行程序或者动态库依赖的不是系统库,就必须手动去给每一个程序或库设置rpath路径

Mac下安装Homebrew

Homebrew是MacOS(或 Linux)的软件包管理器。通过它,我们可以方便的对Mac上的各种应用软件进行管理,例如:安装、更新、查看、搜索、卸载等。可以使用以下命令安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。