香橙派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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909077.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python工具開發】k3q_arxml 簡單但是非常好用的arxml編輯器,可以稱為arxml殺手包

k3q_arxml 介紹 倉庫地址1 倉庫地址2 極簡的arxml編輯庫,純python實現 用法 from pprint import pp # 可以美化打印對象,不然全打印在一行 import k3q_arxml # 加載arxml文件 io_arxml k3q_arxml.IOArxml(filepaths[test/model_merge.arxml])# 打印…

【CSS-8】深入理解CSS選擇器權重:掌握樣式優先級的關鍵

CSS選擇器權重是前端開發中一個基礎但極其重要的概念,它決定了當多個CSS規則應用于同一個元素時,哪條規則最終會被瀏覽器采用。理解權重機制可以幫助開發者更高效地編寫和維護CSS代碼,避免樣式沖突帶來的困擾。 1. 什么是CSS選擇器權重&…

大語言模型原理與書生大模型提示詞工程實踐-學習筆記

📘 第五期書生葡語實戰營講座總結 🎙 主講人:王明(東部大學 數據挖掘實驗室 博士生) 一、大語言模型的生成原理 架構基礎:采用 Transformer(Decoder-only)架構,如 GPT …

李沐 《動手學深度學習》 | 實戰Kaggle比賽:預測房價

文章目錄 1.下載和緩存數據集2.數據預處理讀取樣本預處理樣本數值型特征處理特征標準化的好處離散值處理轉換為張量表示 訓練K折交叉驗證模型選擇最終模型確認及結果預測代碼總結提交到Kaggle 房價預測比賽鏈接:https://www.kaggle.com/c/house-prices-advanced-reg…

一鍵部署Prometheus+Grafana+alertmanager對網站狀態進行監控

在建設監控體系的過程中,針對一個系統的監控是多維度的,除了服務器資源狀態、中間件狀態、應用狀態外,對系統訪問狀態的監控也是很有必要,可以在系統訪問出現異常時第一時間通知到我們。本文介紹使用 Docker-compose 方式一鍵部署…

康謀方案 | 高精LiDAR+神經渲染3DGS的完美融合實踐

目錄 一、從點云到高精地圖的重建 1、數據采集 2、點云聚合 3、高精地圖建模 4、三維建模與裝飾 二、顛覆性革新:NeRF 與 3DGS 重建 1、僅需數日,完成街景重建 2、進一步消除 Domain gap,場景逼真如實地拍攝 3、降本增效&#xff0c…

MySQL-事務(TRANSACTION-ACID)管理

目錄 一、什么是事務? 1.1.事務的定義 1.2.事務的基本語句 1.3.事務的四大特性(ACID) 二、數據庫的并發控制 2.1.什么是并發及并發操作帶來的影響? 2.2.并發操作帶來的隔離級別 三、使用事務的場景 3.1.銀行轉賬場景示例 3.2.模擬…

centos系統docker配置milvus教程

本人使用的是京東云服務器配置milvus 參考教程:https://blog.csdn.net/withme977/article/details/137270087 首先確保安裝了docker 、docker compose docker -- version docker-compose --version創建milvus工作目錄 mkdir milvus # 進入到新建的目錄 cd milvu…

什么是JSON ?從核心語法到編輯器

一、什么是JSON ? JSON,即 JavaScript 對象表示法,是一種輕量級、跨語言、純文本的數據交換格式 。它誕生于 JavaScript 生態,但如今已成為所有編程語言通用的 “數據普通話”—— 無論前端、后端,還是 Python、Java&…

計算機網絡(7)——物理層

1.數據通信基礎 1.1 物理層基本概念 物理層(Physical Layer)是所有網絡通信的物理基礎,它定義了在物理介質上傳輸原始比特流(0和1)所需的機械、電氣、功能、過程和規程特性 1.2 數據通信系統模型 信源:生成原始數據的終端設備,常見形態包括…

深度學習基礎知識總結

1.BatchNorm2d 加速收斂:Batch Normalization 可以使每層的輸入保持較穩定的分布(接近標準正態分布),減少梯度更新時的震蕩問題,從而加快模型訓練速度。 減輕過擬合:批歸一化引入了輕微的正則化效果&#…

iOS 抖音首頁頭部滑動標簽的實現

抖音首頁的頭部滑動標簽(通常稱為"Segmented Control"或"Tab Bar")是一個常見的UI組件,可以通過以下幾種方式實現: 1. 使用UISegmentedControl 最簡單的實現方式是使用系統自帶的UISegmentedControl: let segmentedCo…

ThreadLocal實現原理

ThreadLocal 是 Java 中實現線程封閉(Thread Confinement)的核心機制,它通過為每個線程創建變量的獨立副本來解決多線程環境下的線程安全問題。 Thread └── ThreadLocalMap (threadLocals) // 每個線程持有的專屬Map├── Entry[] tab…

【筆記】結合 Conda任意創建和配置不同 Python 版本的雙軌隔離的 Poetry 虛擬環境

如何結合 Conda 任意創建和配置不同 Python 版本的雙軌隔離的Poetry 虛擬環境? 在 Python 開發中,為不同項目配置獨立且適配的虛擬環境至關重要。結合 Conda 和 Poetry 工具,能高效創建不同 Python 版本的 Poetry 虛擬環境,接下來…

defineAsyncComponent

下面,我們來系統的梳理關于 defineAsyncComponent 懶加載 的基本知識點: 一、異步組件核心概念 1.1 什么是異步組件? 異步組件是 Vue 中一種按需加載組件的機制,允許將組件代碼拆分為獨立的 chunk,在需要時再從服務器加載。這種技術能顯著提升應用初始加載速度。 1.2 為…

ANeko v1.0.3 | 在手機里養只寵物貓 實時互動 動畫細膩

ANeko是一款專為喜歡貓咪的用戶設計的互動養寵應用。它讓你在手機屏幕上擁有一只可愛的貓咪動畫,這只貓咪會實時跟隨你的手指觸摸軌跡,帶來生動有趣的互動體驗。該應用不僅保留了用戶熟悉的交互式貓動畫,還結合了現代高清圖形技術&#xff0c…

人工智能AI

AI 簡介 AI 使我們能夠生成可以改進衛生保健的出色軟件,讓人能夠克服生理上的不便,改進智能基礎結構,創造令人驚嘆的娛樂體驗,甚至拯救地球! 什么是 AI? 簡而言之,AI 就是一種模仿人類行為和能力的軟件。 關鍵工作負載包括: 機器學習 - 它通常是 AI 系統的基礎,也是…

Vue 中 data 選項:對象 vs 函數

Vue 中 data 選項&#xff1a;對象 vs 函數 在 Vue 開發中&#xff0c;data 選項可以使用對象或函數形式&#xff0c;了解它們的使用場景非常重要。下面我將通過一個直觀的示例來展示兩者的區別和適用場景。 <!DOCTYPE html> <html lang"zh-CN"> <h…

python打卡第49天

知識點回顧&#xff1a; 通道注意力模塊復習空間注意力模塊CBAM的定義 CBAM 注意力模塊介紹 從 SE 到 CBAM&#xff1a;注意力機制的演進 之前我們介紹了 SE&#xff08;Squeeze-and-Excitation&#xff09;通道注意力模塊&#xff0c;其本質是對特征進行增強處理。現在&#…

iOS和桌面雙端抓包實戰經驗總結:Sniffmaster與常見工具組合解析

近幾年&#xff0c;移動端和桌面端的網絡調試工作變得越來越“棘手”。過去一個代理證書搞定的場景&#xff0c;現在常常被HTTPS加密、雙向驗證、App安全策略給難住。特別是涉及到iOS平臺時&#xff0c;很多傳統抓包方案都不再適用。作為一名在多個平臺開發和測試的程序員&…