Linux下软件打包

0.准备

测试使用的是我的第一个软件:BlackWidow

编译后得到可执行文件

exe

运行一下

ui

1.库文件

要想在别的系统中也可以正常使用,需要把编译时的库文件集中在一起,
我们使用脚本自动复制

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
# 用于批量获取软件的链接库

exe=${0%.*}
echo $exe
des=$(cd `dirname $0`;pwd)
echo $des

deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
echo $deplist
cp $deplist $des

将上面的脚本代码保存为.sh格式文件,文件名为可执行文件名。

执行之后,所有的库文件就到了可执行文件目录下

lib

把数据库、配置文件等等需要的所有文件都复制到加载目录

2.run格式

run格式是由执行脚本和可执行文件压缩包组成。压缩包通过数据的形式加在脚本后面,执行时先把压缩包导出来,然后继续执行脚本直到结束。

那么打包run格式有三个步骤:

(1)写脚本
(2)压缩可执行文件
(3)拼接脚本和压缩包
(4)执行

2.1 写脚本

示例脚本

1
2
3
4
5
6
7
8
9
10
11
12
# !/bin/bsh
lines=12 #末尾空一行,行数比实际行数多一行
tail -n +$lines "$0" > /tmp/cal.tar.xz
xz -d /tmp/cal.tar.xz
mkdir /tmp/calculator.tmp/
tar -xvf /tmp/cal.tar -C /tmp/calculator.tmp/
cd /tmp/calculator.tmp/
./calculator
rm -rf /tmp/calculator.tmp/
rm /tmp/cal.tar
exit

将上面的脚本保存为.sh格式文件,其中末尾要有一个空行用于添加压缩包。
那么本次测试软件的脚本为:

1
2
3
4
5
6
7
8
9
10
11
12
# !/bin/bsh #第一行
lines=12 #末尾空一行,行数比实际行数多一行,代码行数为11
tail -n +$lines "$0" > /tmp/blackwidow.tar.xz #将lines后面的所有内容作为tar.xz格式导出。如果行数不对导出会出错
xz -d /tmp/blackwidow.tar.xz #解压为tar格式
mkdir /tmp/blackwidow.tmp/#创建解压缩临时文件夹
tar -xvf /tmp/blackwidow.tar -C /tmp/blackwidow.tmp/#解压tar格式到临时文件夹
cd /tmp/blackwidow.tmp/#转移到临时文件夹
./Blackwidow#执行程序
rm -rf /tmp/blackwidow.tmp/#执行完成后删除临时文件
rm /tmp/black.tar#删除解压的中间文件
exit#退出脚本,至此程序执行完成,退出

$0表示文件自身

tail -n +12 表示将本run文件的从第12行起复制到/tmp/cal.tar.xz文件中

xz命令为解压xz压缩包,得到tar格式压缩包

tar命令为解压tar格式压缩包,并将结果导出到-C 指定的文件夹中,文件夹需要先创建

将工作目录转移到解压后的文件夹,并执行

执行完成后删除所有临时文件

退出

2.2 压缩文件

将所有的可执行文件及配置文件压缩为.tar.xz文件

文件名要和脚本中的文件名相同

2.3 拼接文件

1
cat *.sh *.tar.xz > *.run

就会生成.run格式文件,然后赋予可执行权限就可以了。

run

执行后,会把压缩包的文件全部解压到临时文件夹中,然后执行程序。软件退出后会删除所有的临时文件。

此格式优点是执行方便,缺点就是每次执行都要解压文件,如果文件很大会很耗时。

3.deb格式

创建一个根目录 //root

例如/home/jackey/application

创建DEBIAN文件夹,添加control文件,必须是utf-8编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Package:fungame
Version:1.0
Section:games
Priority:optional
Architecture:i386
Essential:no
Depends:libfungame,gamelibrary(>=1.4.0)
Recommends:fungamesaves1|fungamesaves2
Suggests:optionalfungame
Installed-Size:1024
Maintainer:Game Maker[gamer@gamers.net]
Conflicts:stupidfungamethatbreaksthisone
Replaces:oldfungame
Description:A short description of the program
...
A long description

要留有空行

Package:指该软件包的名字。如果你的软件包名称有两个词,用一个连字符(-)把它们连起来。软件包的名称只能有小写的英文字母,数字(不管你相信不相信)以及"+“和”-"。

Version:显然是程序的版本。确保这里的值不包括连字符。

Section:列出了你的软件属于的类别,可能的值包括admin(管理),games(游戏),gnome,kde,mail(电子邮件),misc(杂项)<译者注:misc是miscellaneous的简称>,net(网络),sound(声音),text(文本),utils(实用工具)和web(万维网)。

Priority:声明这个包的优先级(大部分的时候使用optional(可选的))。

Architecture:是该程序可运行的CPU架构(可能的值为i386,amd64和powerpc)<译者注:此处虽然是专有名词,但是由于linux是大小写敏感的,所以文件内还是应该小写>。

Eseential:指该软件包是否是必须的(大部分的时候不是)。

Depends:意味着要使用这个程序必须拥有的程序,

Recommends:指除了极特殊情况下的安装之外,大多数时候都需要的依赖关系。

Suggests:意味可能给这个软件带来更多功能的,但是没有完全没有问题的依赖关系<译者注:同Recommands>。你可以用英文的半角逗号分开不同的依赖关系(,)。如果两个软件中的任何一个可以工作,用竖线"|"分开它们。你也可以指定特定的版本,用在括号里用<<(小于),<=(小于或等于),=(等于),>=(大于或等于),或>>(大于)来表示。

Install-Size是程序安装后的大小,按KB算。

Maintainer:就是你(写上你的名字,后面的方括号"[ ]"里留下你的电子邮件地址)。

Conflicts:表示跟这个程序冲突的软件。

Replaces:表明哪些软件包将被这个程序取代。

Description:显示你的描述。

这样你的control文件就完成了,把它保存到一个名为"/DEBIAN"的文件夹里(注意必须大写)。例如,如果你正在建立一个软件包,并且你的要打包的软件是在/fungame/,那么你应该把你的control文件放在/fungame/DEBIAN/下面。

现在是时候添加实际程序了。复制要打包的程序到你的工作文件夹(上文中的/fungame)。比如说,如果软件X位于/usr/local/X/,可执行文件在/usr/bin/X,你的.deb文件夹是/fungame/,把/usr/local/X/的所有东西复制到/fungame/usr/local/X/,同时复制文件夹/usr/bin/fungame/下的所有东西到/fungame/usr/bin。

你也可以建一个菜单条目(一个.desktop文件),这里的例子位于~/fungame/usr/share/applications/fungame.desktop。这个文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
[Desktop Entry]
Type=Application
Version=1.0
Encoding=UTF-8
Name=Fun Game
Exec=fungame
Comment=
Icon=/usr/local/fungame/fungame.png
Terminal=false
Categories=Application;Game;
StartupNotify=false
MimeType=

你可以忽略"Icon"那一行

目录结构如下

1
2
3
4
5
6
7
mydeb
|----DEBIAN
|-------control
|-------postinst
|-------postrm
|----usr
|----- ***

构建deb包

1
dpkg -b [derectory] [packagename.deb]

4.appimage格式

4.1 打包工具

先下载打包软件:https://github.com/AppImage/AppImageKit/releases
网络上面常用的linuxdeployqt无法使用,不知道为什么

测试中

5.pkg.tar.xz格式

待添加