最近的一个ubuntu下的项目需要提交测试验收了,于是需要我们将程序打包。
打包的本质是将原始文件压缩与相应的控制命令绑定,最后进行软件安装的时候是将对应文件解压到指定目录,根据我们提供的控制逻辑来进行安装操作。
原来在windows下打包 我选择采用了 advancedInstaller ,而这次我使用了系统自带的dpkg
#环境准备
- ubuntu 14.04
- 可执行程序
- 所有的静态链接库
#安装必须工具
apt-get install dh-make
#准备安装文件夹
可以在任意位置下进行,创建如下结构的目录
- 文件根/
- DEBIAN/
control
....
- opt/
- filename/
可执行文件
静态链接库
对于最后的安装过程来说 文件根将对应成系统根目录,如果我们需要添加对应文件到系统指定位置 只要在文件根对应文件层次上放上指定文件就可以了
比如我们要在 /usr/local/lib 下添加 libtest.a
那么最后的组织就会变成
- 文件根/
- DEBIAN/
control
....
- opt/
- filename/
可执行文件
静态链接库
- usr
-local/
-lib/
libtest.a
DEBIAN文件夹下存放的是相应的控制逻辑,control文件是必须的。
control文件下配置程序的元信息
内容大致如下
Package:#包名
Version:#版本号
Section:gnome
Priority: extra #优先级
Maintainer: name<mailaddress> #维护者
Homepage: http://... #主页地址
Architecture: amd64 #这里添加 i386 amd64等参数
Depends:<span style="white-space:pre"></span>#如果存在依赖的库在这里填写
Description:#描述信息
相关手册上的描述 请参考https://www.debian.org/doc/debian-policy/ch-controlfields.html
Package (mandatory)
Source
Version (mandatory)
Section (recommended)
Priority (recommended)
Architecture (mandatory)
Essential
Depends et al
Installed-Size
Maintainer (mandatory)
Description (mandatory)
Homepage
Built-Using
在DEBIAN 目录下可以创建一些特定文件保存在特定时间点执行命令
比如
prerm #需要在删除前执行的命令
postrm #需要在删除前执行的命令
其他的我没有用到 需要的可以自行搜索 或者试着在https://www.debian.org/doc/debian-policy/ 上面找一下
#打包
dpkg -b 文件根路径 目标路径(以deb结尾)
e.g
dpkg -b build/test.deb
##可能遇到问题
子文件权限不够
解决方案:将对应文件的权限修改为775
#尝试安装
sudo dpkg -i test.deb
#删除包
sudo dpkg -r test #这个test 是你之前配置的包名
##可能遇到问题
卸载不完全,提示warning
分析:在文件安装路径下存在了一些程序运行时生成的文件,
解决方案:配置 prerm文件 在卸载之前将对应文件先删掉就可以了
卸载了一些不该卸载的东西
分析:在卸载的时候 dpkg是会将安装的所有文件都删除的,所以如果你程序中存在着一些与其他程序共享的部分,那么卸载的时候共享的部分也还是会被删除的,
解决方案:尽可能打包成一个独立的组件,不要将静态库放入系统共享空间中去。
android如何打包成jar包:http://www.linuxdiyf.com/linux/14056.html
linux下如何将xxx.c编译打包成xxx.so:http://www.linuxdiyf.com/linux/13944.html