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