我的示例程序用了Qt,这里讲一下利用linuxdeployqt-x86_64.AppImage打包deb:
先处理依赖,因为一个可执行文件依赖很多动态库,动态库又依赖很多动态库,所以只拷贝可执行文件不行,需要把这一系列依赖文件都找到,并且可执行文件和动态库运行时找其他文件的路径编译完一般是绝对路径,需要改为相对路径才能在改变位置后也能用。假设我们的项目叫ABC。
- 把下载的linuxdeployqt-x86_64.AppImage复制到/usr/local/bin目录,做个软连接或更名linuxdeployqt,方便使用。
- linuxdeployqt会修改可执行文件和依赖的动态库的rpath,以及动态库依赖的其他动态库的rpath,需要用到patchelf这个东西,可以用apt安装。
- 建立一个空目录,起名Project,作为工作目录,在工作目录里再建一个目录,起名ABC,这个第二级的目录才是我们linuxdeployqt用的目录,复制可执行文件到这个目录里。
- linuxdeployqt exeName -bundle-non-qt-libs -verbose=2
exeName是可执行文件,linuxdeployqt会根据这个可执行文件,解析所有依赖的库。
默认是解析依赖的qt库,-bundle-non-qt-libs加上则解析所有依赖库。
-verbose=2 是为了输出正在解析的内容,不加只在出错时输出及最后输出一点信息。 - 如果有不止一个可执行文件,可以在后面添加-executable=其他可执行文件名。例如:
linuxdeployqt mainexe -bundle-non-qt-libs -executable=subexe1 -executable=subexe2 - 使用显式加载的动态库,先不要copy过来,因为依赖分析也会分析这些库,没有必要。等上面依赖分析等处理完了,再copy到相应目录。
- linuxdeployqt会根据依赖,复制依赖库、资源等到工作目录的一些特定目录,并且会修改可执行文件和动态库的rpath,把他们的rpath修改为正确的相对路径。
- 上面执行完后,再把程序需要的一些文件,复制到工作目录里,上面说的显式加载的动态库,也可以这时候拷贝过来。
- 现在这个路径里的可执行文件和so动态库都是相对路径的了,而且库依赖应该是全的。可以把整个第二级目录复制到别的地方或别的机器,应该一样可以运行。
下面就开始打包了。
- 上面说了,项目名ABC的目录在Project目录下面,现在就在Project下面建立一个applications目录,在applications里建立一个ABC.desktop,内容如下,主要是安装后在菜单上或桌面上能出现一个图标。
[Desktop Entry] Name=ABC Comment=ABC test software. GenericName=ABC Exec=/usr/share/ABC/ABC Icon=/usr/share/ABC/myicon.ico Type=Application StartupNotify=false
-
在Project里,建立usr/share目录,把applications和ABC剪切到share目录里。
原来:
Project/ ├── ABC │ ├── ABC │ ├── doc │ ├── lib │ ├── plugins │ ├── resources │ └── translations └── applications └── ABC.desktop
移动文件夹后:
Project/ └── usr └── share ├── ABC │ ├── ABC │ ├── doc │ ├── lib │ ├── plugins │ ├── resources │ └── translations └── applications └── ABC.desktop
-
在Project里,建立一个DEBIAN目录,里面建立一个control文件,内容如下:
package: ABC Version: 1.0.0 Section:Application Priority: optional Architecture: amd64 Depends: Installed-Size:512 Maintainer: ABC Description: ABC-deb
最后的Project目录:
Project/ ├── DEBIAN │ └── control └── usr └── share ├── ABC │ ├── ABC │ ├── doc │ ├── lib │ ├── plugins │ ├── resources │ └── translations └── applications └── ABC.desktop
-
在Project里,执行
dpkg -b . /home/user/ABC.deb
-
上面如果打包正常,会在/home/user目录里产生一个ABC.deb文件,如果要安装,
sudo dpkg -i ABC.deb
至此完成deb打包。