Linux 环境下制作 deb 软件包
一、简介
前面的笔记中已经展示过了,怎么移植的一个工具境到 ARM 环境中,对于使用 buildroot 和 yocto 的朋友来说,此笔记就没有作用了,因为管理工具包会帮我们把这个工作处理了,就算需要自定义包操作方式也不一样,可以参考上一篇笔记。
而对于 ubuntu 这样的操作系统,虽然可以使用 apt-get install 这样的命令去安装对应的工具,但是对于特定板子的适配,从 /etc/apt/sources.list 配置的镜像库中,找不到对应的工具包。比如 GPU、NPU、MPP、显卡等。那么这部分的适配,还得需要我们根据厂商提供的 SDK 进行移植,但是每次都将需要将一个个的 so、.a、相关的配置文件拷贝到对应的路径下也是比较麻烦的,所以我们可以将需要操作的文件直接打包成 deb 文件包,到对应的环境中安装即可。
二、dpkg 命令
这里使用 dpkg 命令进行打包,所以在了解打包流程之前,先了解一下 dpkg 命令
work@work:~$ dpkg --help
用法:dpkg [<选项> ...] <命令>
命令:
-i|--install <.deb 文件名> ... | -R|--recursive <目录> ...
--unpack <.deb 文件名> ... | -R|--recursive <目录> ...
-A|--record-avail <.deb 文件名> ... | -R|--recursive <目录> ...
--configure <软件包名> ... | -a|--pending
--triggers-only <软件包名> ... | -a|--pending
-r|--remove <软件包名> ... | -a|--pending
-P|--purge <软件包名> ... | -a|--pending
-V|--verify <软件包名> ... 检查包的完整性。
--get-selections [<表达式> ...] 把已选中的软件包列表打印到标准输出。
--set-selections 从标准输入里读出要选择的软件。
--clear-selections 取消选中所有不必要的软件包。
--update-avail <软件包文件> 替换现有可安装的软件包信息。
--merge-avail <软件包文件> 把文件中的信息合并到系统中。
--clear-avail 清除现有的软件包信息。
--forget-old-unavail 忘却已被卸载的不可安装的软件包。
-s|--status <软件包名> ... 显示指定软件包的详细状态。
-p|--print-avail <软件包名> ... 显示可供安装的软件版本。
-L|--listfiles <软件包名> ... 列出属于指定软件包的文件。
-l|--list [<表达式> ...] 简明地列出软件包的状态。
-S|--search <表达式> ... 搜索含有指定文件的软件包。
-C|--audit [<表达式> ...] 检查是否有软件包残损。
--yet-to-unpack 列出标记为待解压的软件包。
--predep-package 列出待解压的预依赖。
--add-architecture <体系结构> 添加 <体系结构> 到体系结构列表。
--remove-architecture <体系结构> 从架构列表中移除 <体系结构>。
--print-architecture 显示 dpkg 体系结构。
--print-foreign-architectures 显示已启用的异质体系结构。
--assert-<特性> 对指定特性启用断言支持。
--validate-<属性> <字符串> 验证一个 <属性>的 <字符串>。
--compare-vesions <a> <关系> <b> 比较版本号 - 见下。
--force-help 显示本强制选项的帮助信息。
-Dh|--debug=help 显示有关出错调试的帮助信息。
-?, --help 显示本帮助信息。
--version 显示版本信息。
Assert 特性: support-predepends, working-epoch, long-filenames,
multi-conrep, multi-arch, versioned-provides.
可验证的属性:pkgname, archname, trigname, version.
调用 dpkg 并带参数 -b, --build, -c, --contents, -e, --control, -I, --info,
-f, --field, -x, --extract, -X, --vextract, --ctrl-tarfile, --fsys-tarfile
是针对归档文件的。 (输入 dpkg-deb --help 获取帮助)
选项:
--admindir=<目录> 使用 <目录> 而非 /var/lib/dpkg。
--root=<目录> 安装到另一个根目录下。
--instdir=<目录> 改变安装目录的同时保持管理目录不变。
--path-exclude=<表达式> 不要安装符合Shell表达式的路径。
--path-include=<表达式> 在排除模式后再包含一个模式。
-O|--selected-only 忽略没有被选中安装或升级的软件包。
-E|--skip-same-version 忽略版本与已安装软件版本相同的软件包。
-G|--refuse-downgrade 忽略版本早于已安装软件版本的的软件包。
-B|--auto-deconfigure 就算会影响其他软件包,也要安装。
--[no-]triggers 跳过或强制随之发生的触发器处理。
--verify-format=<格式> 检查输出格式('rpm'被支持)。
--no-debsig 不去尝试验证软件包的签名。
--no-act|--dry-run|--simulate
仅报告要执行的操作 - 但是不执行。
-D|--debug=<八进制数> 开启调试(参见 -Dhelp 或者 --debug=help)。
--status-fd <n> 发送状态更新到文件描述符<n>。
--status-logger=<命令> 发送状态更新到 <命令> 的标准输入。
--log=<文件名> 将状态更新和操作信息到 <文件名>。
--ignore-depends=<软件包>,...
忽略关于 <软件包> 的所有依赖关系。
--force-... 忽视遇到的问题(参见 --force-help)。
--no-force-...|--refuse-...
当遇到问题时中止运行。
--abort-after <n> 累计遇到 <n> 个错误后中止。
可供--compare-version 使用的比较运算符有:
lt le eq ne ge gt (如果版本号为空,那么就认为它先于任意版本号);
lt-nl le-nl ge-nl gt-nl (如果版本号为空,那么就认为它后于任意版本号);
< << <= = >= >> > (仅仅是为了与主控文件的语法兼容)。
'apt' 和 'aptitude' 提供了更为便利的软件包管理。
注意: 关于每个命令的详细使用,我这里就不过多介绍了,百度一下很容易找到
三、deb 软件打包
创建测试程序
这里创建一个简单的测试文件 hello.c,程序如下,并执行下面步骤#include <stdio.h> int main()
{
printf("hello app test!\n");
return 0;
}
注意: 使用命令
gcc hello.c -o hello编译成可执行文件,如果需要在 ARM 环境下,请用交叉编译工具创建打包文件
创建一个文件夹,用于存放需要打包的文件,并且文件的路径便是安装的路基,如下图所示

编写control 文件
用于描述 deb 包的名称、版本、描述、作者、依赖等Package: testapp
Version: 1.0
Section: utils
Priority: optional
Architecture: amd64
Depends: libc6 (>= 2.15), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.1.1)
Maintainer: Your Name <yourname@email.com>
Description: Test program
Production of deb software package for testing
注意: 报名不能有 _ + - 等字符,否则打包的时候会出现错误
deb 打包
dpkg -b testapp testapp-1.0.deb

安装 deb 软件包
sudo dpkg -i testapp-1.0.deb

查看是否安装成功
dpkg -l | grep testapp

程序使用测试
hello

卸载程序
# 卸载程序及配置文件
dpkg -P <package> # 卸载程序
dpkg -r <package>
其他常用命令
# 查看软件包的内容
dpkg -c <package_file_path> # 查看软件包(已安装)的详细信息
dpkg -s <package> 或 dpkg --status <package> # 查看软件包的安装位置
dpkg -L <package> 或 dpkg --list-files <package> # 解压 deb 软件包
dpkg -x <package_file_path> ./<file_name>
dpkg -x testapp-1.0.deb ./
参考资料
ubuntun制作deb安装包:https://blog.csdn.net/weixin_51495377/article/details/132797013
为ubuntu系统制作deb安装包:https://blog.csdn.net/weixin_44789033/article/details/132759829
手把手教你如何在linux环境下制作deb软件包:https://blog.csdn.net/qq_43257914/article/details/131609720
Linux 环境下制作 deb 软件包的更多相关文章
- windows和linux环境下制作U盘启动盘
新笔记本上,要装xp的系统,100%会破坏原有的Linux系统,因为安装xp的时候会自动覆盖硬盘的主引导扇区,这个扇区一旦被重写,那么原有的linux根本就启动不了. 要想玩linux和xp双系统,一 ...
- linux环境下deb格式 转换成rpm格式
linux环境下deb格式 转换成rpm格式 使用alien工具转换deb格式到rpm格式 alien_8.87.tar.gz 下载alien_8.87.tar.gz [root@mysqlnode2 ...
- linux环境下(非UI操作)所有软件的安装与卸载总结
UI界面的软件管理 linux下的软件一般都是经过压缩的,主要的格式有这几种:rpm.tar.tar.gz.tgz等.所以首先拿到软件后第一件事就是解压缩. 在xwindow下以rpm格式的软件安装比 ...
- Ubuntu下制作deb包的方法详解
1 认识deb包 1.1 认识deb包 deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组. 由于 Unix ...
- linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg)
linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg) 2013-11-10 16:51:14 分类: 系统运维 为什么要写这篇文章? 答:通过常规的三大步(./confi ...
- Linux环境下使用图形化界面的SVN客户端软件-RabbitVCS
如果想在Linux环境下使用图形化界面的SVN客户端软件,那么RabbitVCS绝对是首选,可以媲美Windows环境下用的TortoiseSVN,甚至连操作都基本一样,所以强烈推荐给各位童鞋. Ra ...
- Linux环境下使用JFS文件系统
Linux环境下使用JFS文件系统 JFS是IBM公司为linux系统开发的一个日志文件系统.从IBM的实力及它对Linux的态度来看,JFS应该是未来日志文件系统中最具实力的一个文件系统. JFS提 ...
- Linux环境下发布.net core
一.安装Linux环境 1. 安装VM虚拟机和操作系统 VM虚拟工具安装的过程详见:http://blog.csdn.net/stpeace/article/details/78598333.直接按照 ...
- Memcached在Linux环境下的使用详解
一.引言 写有关NoSQL数据库有关的文章已经有一段时间了,可以高兴的说,Redis暂时就算写完了,从安装到数据类型,在到集群,几乎都写到了.如果以后有了心得,再补充吧.然后就 ...
- Linux环境下安装NodeJS和mongoDB
前面的话 本文将详细介绍如何下Linux环境下安装NodeJS和mongoDB NodeJS [1]使用二进制包安装 1.在官网下载Linux环境下的NodeJS安装包 2.通过xftp软件将安装包上 ...
随机推荐
- CSP:Object as Point同会议论文,相似思想用于人脸和行人检测 | CVPR 2019
CSP将目标定义为中心点和尺寸,通过网络直接预测目标的中心和寸尺,相对于传统的RCNN类型检测算法轻量化了不少.整体思想与Object as Points撞车了,真是英雄所见略同 来源:晓飞的算法 ...
- KingbaseES V8R6 Deallocate 语句使用说明
用途 DEALLOCATE被用来释放一个之前PREPARE好的SQL语句.如果不显式地释放一个PREPARE语句,那么会话结束时会释放它. prepare语句类似oracle的绑定变量 绑定过程: 1 ...
- jQuery AJAX 常见属性
1 jQuery.ajax(...) 2 部分参数: 3 url:请求地址 4 type:请求方式,GET.POST(1.9.0之后用method) 5 headers:请求头 6 data:要发送的 ...
- Python爬取腾讯疫情实时数据并存储到mysql数据库
思路: 在腾讯疫情数据网站F12解析网站结构,使用Python爬取当日疫情数据和历史疫情数据,分别存储到details和history两个mysql表. ①此方法用于爬取每日详细疫情数据 1 impo ...
- 父组件明明使用了v-model,子组件竟然可以不用定义props和emit抛出事件,快来看看吧
前言 vue3.4增加了defineModel宏函数,在子组件内修改了defineModel的返回值,父组件上v-model绑定的变量就会被更新.大家都知道v-model是:modelValue和@u ...
- 面试官:Redis如何实现延迟任务?
延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务.也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行. 延迟任务的常见使用场景有以下几个: 定时发送 ...
- APM vs NPM
概述 APM:Application Performance Monitoring 的简称,即应用性能监控. NPM:Network Performance Monitoring 的简称,即网络性能监 ...
- HarmonyOS开发者创新大赛总决赛结果公布
原文:https://mp.weixin.qq.com/s/I-AofLNY72_CtnHWg2k-Bw,点击链接查看更多技术内容. 2021 年 10 月 22 日第二届 HarmonyOS 开发者 ...
- IaC 管理新思路:Walrus 和 Terraform 的差异化探索
Terraform 的社区版本及商业化版本,让其成为在基础设施即代码(IaC)领域中可靠的部署和管理平台.尽管目前 Terraform Cloud/Enterprise 仍然是最为广泛采用的 IaC ...
- 树模型-CART树
分类回归树CART CART树是后面所有模型的基础,也是核心树 在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择.在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特 ...