esnap打包C/C++程序与动态链接库(.so)
之前已经学会了snap基本的打包程序,现在试试打包C/C++程序与动态链接库(.so)
ssh : orangepi@本地ip
密码 : orangepi操作系统发行版: 基于 Ubuntu 20.04.6 LTS(Focal Fossa)的定制版本,专门为 Orange Pi 设备优化。PRETTY_NAME="Orange Pi 1.0.6 Focal"
目录
进入项目主目录:
整备项目结构:
添加对应文件的读写权限:
gcc编译主函数文件:
编写snap.yaml:
yaml文件解释:
snap打包:
测试snap文件:
打包后完整命令交互过程列出:
重构snap:
删除snap:
进入项目主目录:
cd /home/orangepi/snap_packet_test/gccso/
整备项目结构:
.../gccso/
--------lib/
----------------libtest.so
--------meta/
|----------------snap.yaml
--------src/
|----------------testso.c
--------test.h
添加对应文件的读写权限:
这一步注意要先cd到对应文件目录再说:
chmod +rwx libtest.so chmod +rwx testso.c
gcc编译主函数文件:
gcc testso.c -L. -ltest -o testso
得到可执行程序,把它复制到项目大目录下
编写snap.yaml:
cd /home/orangepi/snap_packet_test/gccso/meta/
name: testso version: '0.12' summary: My test Snap description: A test Snap that needs libtest.so base: core22grade: stable confinement: strictparts:testso:plugin: makesource: ../srcbuild-packages:- build-essentialstage-packages:- libtestmylib:plugin: nilsource: ../libstage: [libtest.so]prime: [libtest.so]apps:testso:command: testsoenvironment:LD_LIBRARY_PATH: $SNAP/usr/lib:$SNAP/lib
yaml文件解释:
这里是AI生成的注释解析:
name: testso version: '0.12' summary: My test Snap description: A test Snap that needs libtest.so base: core22
name
: Snap 包的名称(不可更改,除非重新打包)。version
: Snap 的版本号,可以自由修改(如0.13
)。summary
: 简短描述,可自定义。description
: 详细描述,可自定义。base
: 基础 Snap 镜像(core22
是 Ubuntu 22.04 的基础),通常不需要修改。grade: stable confinement: strict
grade
: 发布等级(stable
或devel
),stable
表示正式版,devel
表示开发版。confinement
: 沙盒严格程度(strict
或classic
)。strict
是默认的安全模式,classic
会放宽限制(不推荐,除非必要)。parts:testso:plugin: makesource: ../srcbuild-packages:- build-essentialstage-packages:- libtest
parts
: 定义 Snap 的构建部分。
testso
: 自定义部分名称。plugin: make
: 使用make
插件编译代码(适用于 Makefile 项目)。source: ../src
: 源代码路径(相对于snapcraft.yaml
),可修改为实际路径。build-packages
: 构建时依赖的系统包(如gcc
、make
)。stage-packages
: 运行时需要的系统包(如libtest
)。如果libtest
是自定义库,建议移除并改用下面的mylib
部分。mylib:plugin: nilsource: ../libstage: [libtest.so]prime: [libtest.so]
mylib
: 自定义部分名称,用于打包本地库libtest.so
。
plugin: nil
: 表示不使用任何插件,手动管理文件。source: ../lib
: 本地库的路径(相对于snapcraft.yaml
),可修改为实际路径。stage: [libtest.so]
: 将libtest.so
复制到stage
目录(供后续步骤使用)。prime: [libtest.so]
: 将libtest.so
复制到最终 Snap 包中。apps:testso:command: testsoenvironment:LD_LIBRARY_PATH: $SNAP/usr/lib:$SNAP/lib
apps
: 定义 Snap 的可执行命令。
testso
: 自定义应用名称。command: testso
: 可执行文件名(相对于 Snap 的bin
目录)。如果可执行文件不在根目录,需修改为完整路径(如$SNAP/usr/bin/testso
)。environment
: 运行时环境变量。
LD_LIBRARY_PATH
: 显式指定库搜索路径,确保能找到libtest.so
。如果libtest.so
在非标准路径(如$SNAP/lib/mylib
),需更新此路径。
LD_LIBRARY_PATH
- 如果
libtest.so
被打包到$SNAP/lib/mylib
,修改为:LD_LIBRARY_PATH: $SNAP/lib/mylib:$SNAP/usr/lib:$SNAP/lib
command
路径
- 如果
testso
编译后不在 Snap 根目录,而是在$SNAP/usr/bin
,修改为:command: usr/bin/testso
snap打包:
回到主目录打包snap:
cd /home/orangepi/snap_packet_test/gccso/
打包snap:
snapcraft pack .
打包成功:
测试snap文件:
将文件复制到其他文件夹:
cp testso_0.12_all.snap /home/orangepi/snap_packet_test/test_1/
转到对应的测试文件夹:
cd /home/orangepi/snap_packet_test/test_1/
安装打包好的snap文件:
sudo snap install --dangerous testso_0.12_all.snap
测试运行:
testso
打包后完整命令交互过程列出:
orangepi@orangepi3b:~/snap_packet_test/gccso$ snapcraft pack . Packed testso_0.12_all.snap orangepi@orangepi3b:~/snap_packet_test/gccso$ cp testso_0.12_all.snap /home/orangepi/snap_packet_test/test_1/ orangepi@orangepi3b:~/snap_packet_test/gccso$ cd /home/orangepi/snap_packet_test/test_1/ orangepi@orangepi3b:~/snap_packet_test/test_1$ sudo snap install --dangerous testso_0.12_all.snap testso 0.12 installed orangepi@orangepi3b:~/snap_packet_test/test_1$ testso test1_print test2_print test3_print
重构snap:
在主项目路径可以通过 snapcraft clean 清除构建的snap
sudo snapcraft clean
删除snap:
在测试安装的 Snap 环境中,已安装的 Snap 包可以通过
snap remove
命令卸载
sudo snap remove testso