香橙派3B學習筆記13:deb 打包調用系統庫與.so動態鏈接庫的程序(部分失敗)

之前接觸到了snap打包自己的應用程序與依賴,但它的默認沙盒隔離的機制導致其訪問系統庫有局限性,它在訪問硬件資源的時候沒有的那些權限需要額外聲明,不符合應用發布的便攜性要求。

本文學習下如何用deb打包的方式打包自己需要調用系統庫的程序。順便將之前的gcc動態鏈接庫的流程走一遍

本文失敗的部分是,并沒有像預期的那樣能將我的so文件復制到usr/local/lib,正常的打包解包是可以的,感覺就只是和壓縮包一樣......

目錄

DEB包的組成:

準備需要打包的程序:

GPIO_LED.c? 與 GPIO_LED.h?:

編譯動態鏈接庫:

程序文件調用動態鏈接庫LED_light.c:

編譯C文件為可執行文件:

驗證程序運行:

安裝必要的工具:

創建 ledlight 的 DEB 包:

創建項目目錄結構:

創建control文件:

依賴庫的處理_postinst文件:

創建install文件:?

卸載前腳本_prerm?文件:

構建規則rules 文件:

創建changelog版本號文件:

設定文件權限:

生成deb包:

解包deb:

參考文章:


DEB包的組成:

DEB(Debian Package)是Debian及其衍生系統(如Ubuntu)使用的軟件包格式,主要用于軟件的安裝、升級和管理。

一個DEB包本質上是一個ar歸檔文件,他在構建前,包含以下核心組成部分:

myapp-1.0/                  # 項目根目錄(通常與包名+版本一致)
├── debian/                 # Debian 打包專用目錄(必須存在)
│   ├── control             # 包的元數據(名稱、版本、依賴等)
│   ├── changelog           # 包的更新日志(生成版本號)
│   ├── rules               # 構建規則(Makefile 風格的腳本)
│   ├── copyright           # 版權信息
│   ├── compat              # 兼容性聲明(如 "10" 表示 Debian Policy 10)
│   ├── source/             # 源碼包相關配置(可選)
│   ├── install             # 指定安裝文件的規則(如 `usr/bin/* usr/bin`)
│   ├── preinst             # 安裝前腳本(可選)
│   ├── postinst            # 安裝后腳本(可選)
│   ├── prerm               # 卸載前腳本(可選)
│   ├── postrm              # 卸載后腳本(可選)
│   └── conffiles           # 配置文件列表(如 `/etc/myapp/config.conf`)
├── src/                    # 項目源碼目錄(可選)
│   ├── main.c
│   └── Makefile
└── build/                  # 構建臨時目錄(通常自動生成)
文件名類型說明
control純文本文件定義包的元數據(無后綴)。
changelog純文本文件記錄版本更新歷史(無后綴,格式遵循 Debian Policy)。
rules可執行腳本構建規則(無后綴,本質是 Makefile 腳本,需 chmod +x)。
copyright純文本文件版權聲明(無后綴)。
compat純文本文件兼容性聲明(無后綴,內容如 10)。
install純文本文件定義文件安裝路徑(無后綴,如 usr/bin/* usr/bin)。
preinst可執行腳本安裝前腳本(無后綴,需 #!/bin/shchmod +x)。
postinst可執行腳本安裝后腳本(無后綴)。
prerm可執行腳本卸載前腳本(無后綴)。
postrm可執行腳本卸載后腳本(無后綴)。
conffiles純文本文件列出需要保留的配置文件(無后綴,每行一個路徑如 /etc/myapp.conf)。

準備需要打包的程序:

這一部分先不要在?/home/orangepi/DEB_GPIOLED 進行寫程序,推薦另起一個文件夾,后續將必要的內容復制過去即可

GPIO_LED.c? 與 GPIO_LED.h?:

GPIO_LED.c? 與 GPIO_LED.h

這是基礎的LED初始化與點亮程序 , 被注釋部分用于測試其子函數是否奏效

該程序需要被構建為一個libGPIO_LED.so動態鏈接庫

#include "GPIO_LED.h"void GPIO_LED_init(void)
{// 初始化 wiringPi(必須調用,否則會報錯)wiringPiSetup();  // 使用 wiringPi 的引腳編號pinMode(LED_BLUE,OUTPUT);pinMode(LED_RED,OUTPUT);pinMode(LED_GREEN,OUTPUT); //初始化全滅digitalWrite(LED_BLUE ,LOW);digitalWrite(LED_RED ,LOW);digitalWrite(LED_GREEN ,LOW); }//控制LED 紅色亮滅
void LED_RED_(char flag)
{if(flag == 1){digitalWrite(LED_RED ,HIGH);}else if(flag == 0){digitalWrite(LED_RED ,LOW); }
}//控制LED 藍色亮滅
void LED_BLUE_(char flag)
{if(flag == 1){digitalWrite(LED_BLUE ,HIGH);}else if(flag == 0){digitalWrite(LED_BLUE ,LOW); }
}//控制LED 綠色亮滅
void LED_GREEN_(char flag)
{if(flag == 1){digitalWrite(LED_GREEN ,HIGH);}else if(flag == 0){digitalWrite(LED_GREEN ,LOW); }
}/*
int main(void)
{GPIO_LED_init();while(1){LED_GREEN_(0);LED_RED_(1);delay(500);LED_GREEN_(1); LED_RED_(0);  delay(500);    }
}
*/
#include <stdio.h>
#include <wiringPi.h>#define LED_BLUE 13
#define LED_RED 15
#define LED_GREEN 18void GPIO_LED_init(void);
void LED_RED_(char flag);
void LED_BLUE_(char flag);
void LED_GREEN_(char flag);

編譯動態鏈接庫:

編譯動態鏈接庫:

gcc GPIO_LED.c -fPIC -shared -o libGPIO_LED.so

將該動態鏈接庫復制到目錄 /usr/local/lib:?下:

sudo cp libGPIO_LED.so /usr/local/lib

更新動態鏈接器緩存:

sudo ldconfig

檢查動態鏈接庫:

ldd libGPIO_LED.so

但我們發現ldd命令檢查出的libGPIO_LED.so是靜態的,這是

ldd 的誤判,ldd 通常用于檢查動態庫的依賴關系,但如果庫 沒有依賴任何其他動態庫(比如沒有調用 libc 的函數,或者 GCC 靜態鏈接了部分庫)

如果 GPIO_LED.c 沒有使用任何 libc 函數(如 printfmalloc 等),并且沒有鏈接其他庫(如 -lpthread),那么 ldd 會認為它“靜態鏈接”,因為沒有外部依賴。

此時使用file命令更準確徹底:

根據 file 命令的輸出, libGPIO_LED.so 確實是一個 動態鏈接庫(shared object),并且顯示為 dynamically linked,這與之前 ldd 顯示的 statically linked?不同。

程序文件調用動態鏈接庫LED_light.c:

現在我有個程序文件交LED_light.c,他會調用動態鏈接庫 libGPIO_LED.so,以及WiringPi庫

他會讓LED紅藍交替閃爍:

#include <stdio.h>
#include "GPIO_LED.h"
#include <wiringPi.h>int main(void)
{GPIO_LED_init();while(1){LED_BLUE_(0);LED_RED_(1);delay(500);LED_BLUE_(1); LED_RED_(0);  delay(500);    }
}

編譯C文件為可執行文件:

編譯將LED_Light.c與動態庫libGPIO_LED.so 以及libwiringPi 鏈接生成執行文件ledlight

gcc LED_Light.c -lGPIO_LED -lwiringPi -o ledlight

驗證程序運行:

sudo ./ledlight

LED交替亮滅

?

安裝必要的工具:

sudo apt-get update
sudo apt-get install dh-make dpkg-dev build-essential

創建 ledlight 的 DEB 包:

?每個文件的代碼里的注釋要刪去!

創建項目目錄結構:

一、先創建一個?DEB_GPIOLED?構建Deb包的目錄:

cd /home/orangepi
mkdir DEB_GPIOLED

cd /home/orangepi/DEB_GPIOLED

二、創建打包目錄:

mkdir DEBIAN

mkdir src

mkdir build

創建control文件:

進入目錄:

cd?/home/orangepi/DEB_GPIOLED/debian/

使用文本編輯器創建 control 文件

nano control

確保wiringpi可通過 apt 安裝

apt-cache show wiringpi

Package: ledlight
Version: 1.0-1
Architecture: arm64   # arm64/amd64/armhf
Maintainer: Your Name <your.email@example.com>
Description: Control LED lights via GPIOA simple program to control LED lights using GPIO pins,dynamically linked to libGPIO_LED.so and WiringPi library.
Depends: libc6 (>= 2.28), wiringpi (>= 2.50) # 不寫 libgpio-led ,libgpio-led (>= 1.0)
Section: utils
Priority: optional

在 Debian/Ubuntu 的 control 文件中,Depends 字段是核心的依賴聲明部分,它會告訴包管理系統(如 apt/dpkg)在安裝當前軟件包時自動安裝所依賴的包

將程序文件LED_light.c 和?ledlight復制到 /home/orangepi/DEB_GPIOLED/src/:

依賴庫的處理_postinst文件:

/usr/local/lib/libGPIO_LED.so?是我自定義的庫,手動安裝的,不在 APT 倉庫中,因此不能通過Depends自動安裝,

因此這里將其放在項目的lib文件夾中,以便檢查到目標機器沒有這個庫就復制一個到 /usr/local/lib。

因為庫沒有打包為debian,所以在 postinst 腳本中執行 ldconfig 更新庫緩存:

nano postinst

#!/bin/sh
set -e# 符合FHS的路徑定義
TEMP_LIB="/var/lib/ledlight/libGPIO_LED.so"
TARGET_LIB="/usr/local/lib/libGPIO_LED.so"case "$1" inconfigure)if [ ! -f "$TARGET_LIB" ]; thenecho "Installing libGPIO_LED.so to /usr/local/lib/"mkdir -p /usr/local/libcp "$TEMP_LIB" "$TARGET_LIB"chmod 644 "$TARGET_LIB"ldconfigfi# 總是清理臨時文件rm -f "$TEMP_LIB"rmdir --ignore-fail-on-non-empty /var/lib/ledlight;;abort-upgrade|abort-remove|abort-deconfigure)# 安裝失敗時也清理rm -f "$TEMP_LIB"rmdir --ignore-fail-on-non-empty /var/lib/ledlight;;
esacldconfig  # 確保系統能找到 /usr/local/lib 下的庫exit 0

最后別忘了把libGPIO_LED.so復制到/home/orangepi/DEB_GPIOLED/lib

cd?/home/orangepi/DEB_GPIOLED/

mdir lib

cd /home/orangepi/gcc_cpp_codes/? ?#有libGPIO_LED.so的目錄

cp libGPIO_LED.so /home/orangepi/DEB_GPIOLED/lib/

1

?

創建install文件:?

nano install

將項目目錄下的 lib/libGPIO_LED.so 文件

安裝到目標系統的 /var/lib/ledlight/ 目錄(DEB 包內路徑)

lib/libGPIO_LED.so var/lib/ledlight/

卸載前腳本_prerm?文件:

nano prerm

#!/bin/sh
set -eTARGET_LIB="/usr/local/lib/libGPIO_LED.so"case "$1" inremove|upgrade|failed-upgrade)# 僅在完全卸載(purge)時刪除庫文件if [ "$1" = "remove" ] || [ "$1" = "failed-upgrade" ]; thenif [ -f "$TARGET_LIB" ]; thenecho "Removing libGPIO_LED.so from /usr/local/lib/"rm -f "$TARGET_LIB"fifi;;purge)# 徹底清除時強制刪除if [ -f "$TARGET_LIB" ]; thenecho "Purging libGPIO_LED.so from /usr/local/lib/"rm -f "$TARGET_LIB"fi;;
esacldconfig  # 更新庫緩存
exit 0

構建規則rules 文件:

nano rules

#!/usr/bin/make -f%:dh $@ --with autotools-devoverride_dh_auto_configure:@:override_dh_auto_build:$(MAKE) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS) -lWiringPi -L/usr/local/lib -lGPIO_LED" ledlightoverride_dh_auto_install:# 安裝可執行文件到 /usr/bininstall -D -m 0755 ledlight $(CURDIR)/debian/ledlight/usr/bin/ledlight# 將庫文件安裝到臨時位置(由postinst處理)install -D -m 0644 libGPIO_LED.so $(CURDIR)/debian/ledlight/var/lib/ledlight/libGPIO_LED.sooverride_dh_shlibdeps:dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

創建changelog版本號文件:

基本格式:

package (version) distribution; urgency=urgency* change detail 1* change detail 2* change detail 3-- Maintainer Name <email@address>  Date

對應編寫:

nano changelog

ledlight (1.0-1) unstable; urgency=medium* Initial release.* Includes ledlight executable and libGPIO_LED.so library.* Post-install script handles library installation to /usr/local/lib.-- Your Name <your.email@example.com>  Mon, 24 Jun 2024 14:30:00 +0800

生成日期以更新:

可以通過終端得到當前日期以更新changelog中的日期文件

date -R

如果時區不對,如此設置時區為上海:

sudo timedatectl set-timezone Asia/Shanghai

?

設定文件權限:

chmod 755 debian/postinst debian/prerm
chmod 644 lib/libGPIO_LED.so

生成deb包:

dpkg-deb --build . ../ledlight_1.0-1_arm64.deb

解包deb:

這里我先rm刪除掉以前存在的libGPIO_LED.so

?嘗試解包:

# 創建解壓目錄并解包
mkdir -p ledlight_extracted
dpkg -x ledlight_1.0-1_arm64.deb ledlight_extracted/# 單獨提取控制文件(元數據和腳本)
dpkg -e ledlight_1.0-1_arm64.deb ledlight_extracted/DEBIAN

發現并沒有像預期的那樣將我的so文件復制到usr/local/lib :

參考文章:

如何把代碼打包成一個 deb package_嗶哩嗶哩_bilibili文字稿在 haoduoshipin.com, 視頻播放量 3715、彈幕量 0、點贊數 42、投硬幣枚數 20、收藏人數 88、轉發人數 10, 視頻作者 好奇貓學院, 作者簡介 編程,區塊鏈,密碼學等等。,相關視頻:數字簽名原理,如何把 deb 軟件包上傳到 apt 倉庫中,動畫演示 Diffie-Hellman 密鑰交換算法,挑戰魔改1300天前的塔防代碼 | 手把手教你做冰凍炮臺??,【網安】編寫一個木馬有多簡單?,什么是密碼學?,RSA 算法基本原理,如何使用 font-awesome “字體圖標”,什么是 Ajax ?,最大的開放標準--古代中國https://www.bilibili.com/video/BV1kE411G7vt/?spm_id_from=333.337.search-card.all.click&vd_source=090e0b0724f6022d9ce8b14853097061

deb包構建詳解_deb包制作詳解-CSDN博客

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

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

相關文章

第二十屆“開源中國開源世界”大會:openKylin AI創新實踐與成果分享

2025年6月13日&#xff0c;第二十屆“開源中國開源世界“大會在北京萬壽賓館隆重召開。本屆大會由開源軟件推進聯盟&#xff08;COPU&#xff09;主辦&#xff0c;以“共建人工智能時代的開源生態”為主題&#xff0c;匯聚來自全球開源與AI領域的專家學者、技術領袖與前沿企業&…

微算法科技開發基于布爾函數平方和表示形式的最優精確量子查詢算法

隨著量子計算的迅猛發展&#xff0c;精確量子查詢算法的研究成為量子信息科學的一個重要課題。量子決策樹算法&#xff0c;作為量子計算的核心&#xff0c;微算法科技&#xff08;NASDAQ:MLGO&#xff09;提出了一種新的方式來解決布爾函數查詢問題。該框架從布爾函數的平方和表…

鴻蒙(HarmonyOS)布局系統詳解:Flex、Grid、Stack等布局方式全面解析

在移動應用和分布式系統開發中&#xff0c;界面布局是構建優秀用戶體驗的基礎。鴻蒙操作系統(HarmonyOS)作為華為推出的全場景分布式操作系統&#xff0c;提供了一套強大而靈活的布局系統。本文將全面解析鴻蒙的布局方式&#xff0c;包括Flex、Grid、Stack等核心布局技術&#…

【軟件系統架構】系列四:嵌入式軟件開發流程全解析(包含示例)

目錄 一、需求分析階段 二、系統架構設計階段: 三、開發準備階段 四、底層驅動開發階段(HAL / BSP) 五、操作系統集成階段(RTOS / OS) 六、中間件與協議棧集成階段 七、應用邏輯開發階段 八、調試與測試階段: 九、集成與聯調階段 十、發布與維護階段 總結:完…

接口自動化測試面試(高頻面試常問)+答案

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、結合項目講解項…

Kubernetes 從入門到精通-StatefulSet控制器

一、StatefulSet 基礎概念 1. 與 Deployment 的關鍵區別 特性StatefulSetDeployment網絡標識穩定的 DNS 名稱隨機生成存儲每個 Pod 獨立 PVC&#xff0c;數據持久化 共享存儲或無狀態啟停順序嚴格按序號順序&#xff08;0→N-1 啟動&#xff0c;N-1→0 停止&#xff09;并行適…

Redis ①②-事務

Redis 事務 先來看看 MySQL 事務的四大特性&#xff1a; 原子性&#xff1a;將事務里的多個操作打包成一個整體&#xff0c;要么全部成功&#xff0c;要么全部失敗&#xff0c;失敗后會進行回滾操作。一致性&#xff1a;確保事務執行前后&#xff0c;其數據的整體變化一致。隔…

Leetcode+JAVA+回溯

39.組合總和 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target &#xff0c;找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 &#xff0c;并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個 數字可以 無限制重復…

嘉訊科技:醫院電子病歷系統的關鍵性作用

電子病歷系統在現代醫療領域發揮著至關重要的作用。 電子病歷系統極大地提高了醫療效率。以往&#xff0c;醫生需要翻閱大量的紙質病歷&#xff0c;耗費時間和精力去查找關鍵信息。而電子病歷系統通過數字化的存儲和檢索方式&#xff0c;使得醫生能夠在短時間內獲取患者的完整病…

解決 Docker 里 DrissionPage 無法連接瀏覽器的問題,內含直接可用的Docker鏡像(DrissionPage 瀏覽器鏈接失敗 怎么辦?)

文章目錄 ?? 介紹 ???? 演示環境 ???? 報錯現象與診斷 ???? 源碼?? DrissionPage 報錯內容?? 手動啟動 Chrome 測試?? 原因分析與解決方案 ???? 為什么會這樣??? 解決辦法?? 推薦方案?? 測試?? 可直接使用的Docker鏡像 ???? 鏡像下載地址…

Mysql 數據庫中設備實時狀態表水平分表

一、 需求概述 在使用 Mysql 數據庫存儲設備上報日志時&#xff0c;存在一張設備實時狀態表&#xff0c;隨著時間推移&#xff0c;數據量變得十分龐大。為了更好地管理和查詢數據&#xff0c;提高數據庫性能&#xff0c;需要對該表進行水平分表操作。同時&#xff0c;存在分頁…

nginx的下載與安裝 mac

1. 下載 方法一&#xff1a;本地下載 鏈接&#xff1a;https://nginx.org/en/download.html&#xff08;可直接搜官網&#xff09; 下載到本地后&#xff0c;上傳到linux的某個文件夾中 方法二&#xff1a;直接linux上下載&#xff08;推薦&#xff09; wget -c http://ngi…

在 Mac 上配置 Charles,抓取 iOS 手機端接口請求

工具官網&#xff1a;https://www.charlesproxy.com/ Charles 激活碼 一、簡介 Charles 是一款強大的網絡抓包工具&#xff0c;支持 HTTP 和 HTTPS 協議&#xff0c;適用于調試手機 App、微信小程序、H5 頁面等網絡請求。 它能作為代理服務器&#xff0c;轉發并記錄本機及其他…

較大項目 git(gitee, github) 拉取失敗解決方法

問題描述 近期遇到了一個拉取一個比較大項目失敗的問題&#xff0c;229M這么大 每次都失敗 我在自己的PC上&#xff0c;只有極好的環境才能拉取&#xff0c;筆記本辦公熱點怎么都不行 解決辦法 后面通過https鏈接 首次會報錯&#xff0c;因為我輸入錯了gitee的username&am…

爬蟲中網絡知識基礎

HTTP&#xff08;HyperText Transfer Protocol&#xff09;和 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是互聯網上用于傳輸網頁內容等數據的兩種主要協議&#xff0c;以下是它們的定義和基本工作原理&#xff1a; HTTP 定義 &#xff1a;HTTP 是一種…

安全工具-二進制安全-testssl.sh

1 需求 --openssl <PATH> &#xff1a;use this openssl binary (default: look in $PATH, $RUN_DIR of testssl.sh) --quiet&#xff1a;dont output the banner. By doing this you acknowledge usage terms normally appearing in the banner --severity <severity…

WHAT - 組件庫與 Storybook

文章目錄 什么是 Storybook&#xff1f;使用場景舉例快速上手教程&#xff08;React 為例&#xff09;1. 安裝 Storybook2. 創建一個 Story&#xff08;組件故事&#xff09;3. 啟動 Storybook 常用功能常見生態擴展示例&#xff1a;用 Args 和 Controls 動態控制 Props推薦資料…

魔音音樂 5.0.2 | 無損下載 同步網易云歌單UI美觀

魔音音樂是一款功能豐富的音樂播放軟件&#xff0c;提供高保真音質、智能推薦系統和用戶友好界面。其豐富的音樂庫幾乎覆蓋了所有類型的音樂&#xff0c;無論是流行歌曲還是小眾音樂&#xff0c;都能在這里找到。這款應用非常適合音樂愛好者使用&#xff0c;它不僅讓你享受高品…

云原生時代的中國答案:OLARDB、OceanBase與PostgreSQL的共生革命

以下是對阿里自研數據庫的全景式技術調查,重點梳理其產品體系、與PostgreSQL的技術關聯及發展歷程: 一、阿里自研數據庫全景圖譜 ??1. 核心自研產品?? ??數據庫名稱????類型????技術定位????與PostgreSQL關系????PolarDB??云原生分布式數據庫存儲計…

HTTP 請求方法與狀態碼

前言&#xff1a;構建可靠前端應用的 HTTP 通信基礎 在當今復雜的 Web 應用生態中&#xff0c;前端開發已遠超簡單的頁面構建&#xff0c;轉而成為與后端系統緊密交互的復雜體系。作為這一交互的核心機制&#xff0c;HTTP 協議承載著幾乎所有的前后端數據交換&#xff0c;其設…