当前位置: 首页 > news >正文

香橙派3B学习笔记10:snap打包C/C++程序与动态链接库(.so)

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: 发布等级(stabledevel),stable 表示正式版,devel 表示开发版。
  • confinement: 沙盒严格程度(strictclassic)。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: 构建时依赖的系统包(如 gccmake)。
    • 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

相关文章:

  • 通过一个本地存草稿的示例记录sqflite的使用
  • 国债与企业债:稳健与高收益的债券选择
  • 用Woot助力Prime Day
  • Java + Spring Boot + MyBatis 事务注解 @Transactional 使用规范说明
  • Excel文件数据的读取和处理方法——C++
  • 无需 Mac,使用Appuploader简化iOS上架流程
  • 网络安全之框架安全漏洞分析
  • DeepSpeed 是一个深度学习优化库,使分布式训练和推理变得简单、高效和有效
  • 如何将SeaTunnel MySQL-CDC与Databend 高效整合?格式与方案全解析
  • STM32单片机独立看门狗IWDG使用CubeMX配置方法
  • [docker]--解析 Docker 镜像拉取日志:状态与分层拉取逻辑
  • 【LangChain】3 模型链
  • 阿里1688 普通 231滑块 x82 分析
  • 【Python3教程】Python3基础篇之面向对象
  • 【Docker基础】Docker核心概念:镜像(Image)详解
  • 知名开源项目被收购,用户发现项目被“投毒”
  • 西安java面试总结1
  • Oracle日志体系和遇到问题后日志排查路径
  • 中位数聚合与联邦平均的原理,作用,使用到联邦学习的哪个地方,与联邦学习数据隐私的联系
  • 安卓上架华为应用市场、应用宝、iosAppStore上架流程,保姆级记录(1)
  • 怎么做好网站推广/seo快排公司哪家好
  • 关注网站怎么做/seo关键字优化软件
  • 网站建设 华博互联/新媒体运营培训学校
  • 中国建设银行网站对公业务流程/抚州网站seo
  • 福田做商城网站建设多少钱/自己创建网站
  • 长沙做网站好的公司有哪些/做网站怎么做