# 制作Linux下程序安装包(run文件)

目录

  • 目录
  • 编译信息
  • 说明
  • run文件说明
  • 制作run文件
  • 运行run文件
  • 关于交叉编译的移植问题
  • 参考

编译信息

作者:xzf

创建时间:2021/12/07

更新时间:2021/12/07

说明

本文主要说明,由于使用到交叉编译,需要自己交叉编译出来后,需要安装或移植到目标板子,所以需要制作一个移植安装包。

环境:Linux xzf-linux 5.11.0-37-generic #41~20.04.2-Ubuntu SMP Fri Sep 24 09:06:38 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

run文件说明

  • run文件的内容分两部分一部分是可执行脚本,后一部分是压缩包
  • 可执行脚本的作用是解压压缩包和进行文件内容的安装和配置
  • 压缩包的内容是安装文件

run文件结构:

|-----------------|
| 可执行脚本 |
|-----------------|
| 程序压缩包 |
|-----------------|

制作run文件

  1. 以安装sqlite3为例子
  2. 打包安装好的结构install文件夹
.
├── bin
│   └── sqlite3
├── include
│   ├── sqlite3ext.h
│   └── sqlite3.h
├── lib
│   ├── libsqlite3.a
│   ├── libsqlite3.la
│   ├── libsqlite3.so -> libsqlite3.so.0.8.6
│   ├── libsqlite3.so.0 -> libsqlite3.so.0.8.6
│   ├── libsqlite3.so.0.8.6
│   └── pkgconfig
│       └── sqlite3.pc
└── share
    └── man
        └── man1
            └── sqlite3.1
  • bin的目录是可执行文件
  • include是头文件
  • lib是库文件
  • share是查看命令帮助信息
  1. 安装程序,其实就是把文件移动到Linux系统相对应的文件夹

故,我们先明确要把文件都移动到那里,这样就知道我们的脚本应该怎样写了

以上面为例子。

| 安装包                  |  对应的路径    |
| --------------          | -------------- |
| bin                     | /usr/bin       |
| include                 | /usr/include   |
| lib                     | /usr/lib       |
| share/man/man1          | /usr/share/man |
  1. 打包和编写脚本
  • 把install文件夹打包成tar.gz
tar zcvf install.tar.gz install/
  • 编写固定格式的shell脚本,名为install.sh
#!/bin/bash

# 获取相对路径
CDIR=`pwd`
INSTALLDIR=$CDIR/install

if [ -d "$INSTALLDIR" ]; then
    rm -rf "$INSTALLDIR"
fi

# 当读取到边界“__ARCHIVE_BOUNDARY__”的时候,执行+1行并退出。
ARCHIVE=`awk '/^__ARCHIVE_BOUNDARY__/ { print NR + 1; exit 0; }' $0`

# 提取压缩包,并解压
tail -n +$ARCHIVE $0 > install.tar.gz
tar -zpxf install.tar.gz

# 该执行的命令
# Todo

# 删除压缩包
rm install.tar.gz
# 删除解压后的文件夹install
rm -rf ./install

exit 0
__ARCHIVE_BOUNDARY__
  • 修改我们需要的命令
#!/bin/bash

# 获取相对路径
CDIR=`pwd`
INSTALLDIR=$CDIR/install

if [ -d "$INSTALLDIR" ]; then
    rm -rf "$INSTALLDIR"
fi

# 当读取到边界“__ARCHIVE_BOUNDARY__”的时候,执行+1行并退出。
ARCHIVE=`awk '/^__ARCHIVE_BOUNDARY__/ { print NR + 1; exit 0; }' $0`

#提取压缩包,并解压
tail -n +$ARCHIVE $0 > install.tar.gz
tar -zpxf install.tar.gz

# 该执行的命令
#把文件移动到上述的目标路径
INSTALLPATH=/usr

mv ./install/bin/* $INSTALLPATH/bin
mv ./install/include/* $INSTALLPATH/include
mv ./install/lib/* $INSTALLPATH/lib
mv ./install/share/man/man1/* $INSTALLPATH/share/man

#以防万一,增加chmod +x 命令
chmod +x $INSTALLPATH/bin/sqlite3

#删除压缩包
rm install.tar.gz
#删除解压后的文件夹install
rm -rf ./install

exit 0
__ARCHIVE_BOUNDARY__
  1. 生成run文件
cat install.sh install.tar.gz > install.run

运行run文件

# 增加运行权限
chmod +x install.run
./install.run
# 当脚本运行
sh install.run

关于交叉编译的移植问题

tar: can't create symlink 'install/lib/libsqlite3.so.0' to 'libsqlite3.so.0.8.6': Operation not permitted

问题:主要问题可以参考网上的搜索的,反正没有搞懂。

解决办法:不要在x86上打包,在arm系统里打包就好。

参考

linux中run文件的制作:https://www.jianshu.com/p/59bbf9ce854c

tag(s): linux
show comments · back · home
Edit with Markdown