【Linux系統】動靜態庫的制作

前言:

? ? ? ? 上文我們講到了文件系統【Linux系統】詳解Ext2,文件系統-CSDN博客

? ? ? ? 本文我們來講講動靜態庫的制作

? ? ? ??【Linux】編譯器gcc/g++及其庫的詳細介紹_linux gcc 有哪些庫-CSDN博客

? ? ? ? 這篇文章的第4大點,簡單是介紹了一下庫的基本概念。

靜態庫

? ? ? ? 靜態庫的本質是一種歸檔文件,對所有.o文件進行了打包!

? ? ? ? 不需要使用者解包,而直接使用gcc/g++進行鏈接即可!

#先將所有的 .c文件編譯出 .o問文件
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c  mstr.h  my.c  my.h
yc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c  mstr.h  mstr.o  my.c  my.h  my.o#再將全部 .o文件打包為靜態庫(不包含main函數!)
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ar -cr libmyc.a *o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

? ? ? ? 如上,靜態庫就這樣制作完成了!

????????ar是歸檔工具,將多個.o文件打包成一個文件。選項:-rc表示replace and creat

進行鏈接:

? ? ? ? 我們要鏈接任何非標準庫(包括第三方庫、自己寫的庫)都必須指明-L? -l

? ? ? ? -L:表示去哪里找庫

? ? ? ? -l:表示找那個庫

hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o  test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -c *.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.a  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o  test.c  test.o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -o test test.o -L . -l myc
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ./test
0 1 2 3 4 5 6 7 8 9 

? ? ? ? 鏈接完成,形成可執行程序!

? ? ? ? 注:.h文件的意義就是作為方法手冊

hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib  new test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ tree lib
lib
├── include
│?? ├── mstr.h
│?? └── my.h
└── mylib└── libmyc.a3 directories, 3 fileshyc@hyc-alicloud:~/linux/動靜態庫的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib  new  test  test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ./test
0 1 2 3 4 5 6 7 8 9 

? ? ? ? 當頭文件并不在當前目錄或系統中,就想要 -I選項

? ? ? ? -I:表示去哪里找頭文件。

補充:

? ? ? ? 庫也是要被安裝到系統中的!!!

? ? ? ? 我們正常使用庫,是不可能像上面一樣麻煩的!

? ? ? ? 只需要將頭文件、庫拷貝至系統文件下的默認路徑,以后調用就只需要指明庫名字即可。? ? ?

? ? ? ? 默認路徑:/usr/include,/lib64

動態庫

hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c  mstr.h  my.c  my.h#先將.c文件編譯成.o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -fPIC -c *.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
mstr.c  mstr.h  mstr.o  my.c  my.h  my.o#再將.o文件打包
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ gcc -shared -o libmyc.so *.o
hyc@hyc-alicloud:~/linux/動靜態庫的制作/new$ ls
libmyc.so  mstr.c  mstr.h  mstr.o  my.c  my.h  my.o

? ? ? ? 編譯為.o文件:fPIC:產生位置無關碼(position independent code)

? ? ? ? 打包:與靜態庫使用ar打包不同,動態庫依舊使用gcc進行打包,使用 -shared選項:表示生成共享庫格式

進行鏈接:

hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib  new  test.c
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ tree lib
lib
├── include
│?? ├── mstr.h
│?? └── my.h
└── mylib├── libmyc.a└── libmyc.so3 directories, 4 fileshyc@hyc-alicloud:~/linux/動靜態庫的制作$ gcc -o test test.c -I ./lib/include -L ./lib/mylib -l myc
hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ls
lib  new  test  test.chyc@hyc-alicloud:~/linux/動靜態庫的制作$ ./test
./test: error while loading shared libraries: libmyc.so: cannot open shared object file: No such file or directory

? ? ? ? 如上,我們依舊將所有位置信息告知,鏈接成功得到可執行程序!

? ? ? ? 但是當我們執行可執行程序時,卻發現報錯了!?libmyc.so不打開,不存在?為什么?

hyc@hyc-alicloud:~/linux/動靜態庫的制作$ ldd testlinux-vdso.so.1 (0x00007fff3f37a000)libmyc.so => not foundlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfed7ba000)/lib64/ld-linux-x86-64.so.2 (0x00007fbfed9f1000)

? ? ? ? 因為,我們只告訴了編譯器gcc這些信息,但是并沒有告訴操作系統!

????????靜態庫為什么這問題?因為靜態庫在加載的時候,就已經將庫加載到可執行程序里面了!而動態庫沒有,執行時還需要去查找對應的庫。

解決方法:

????????1.將我們寫的庫直接拷貝到操作系統中

? ? ? ? 2.建立軟連接:在操作系統中新建一個同名庫,并將其與我們自己的庫建立軟連接

? ? ? ? 3.創建/修改環境變量:LD_LIBRARY_PATH(導入庫的路徑)

? ? ? ? 4.ldconfig方案:配置/ etc/ld.so.conf.d/ ,更新ldconfig

補充:

? ? ? ? 1.動靜態庫同時提供,gcc/g++,默認是使用動態鏈接、動態庫!

? ? ? ? ? ?非要靜態鏈接,只能使用 -static(靜態庫必須存在!)

? ? ? ? ? ?只存在靜態庫,當然就默認靜態鏈接了

? ? ? ? 2.Linux下,默認優先安裝動態庫

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

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

相關文章

鏈式二叉樹的基本操作——遍歷

本文筆者將帶領讀者一起學習鏈式二叉樹的一些基本語法,至于更難一些的插入刪除等,筆者將在后續C更新后再次詳細帶領大家學習。 首先,在進行二叉樹之前,我們需要一顆二叉樹,而二叉樹的初始化現階段實現不太現實&#x…

Windows運維之以一種訪問權限不允許的方式做了一個訪問套接字的嘗試

一、問題場景 在Windows 上運維服務過程中,經常會遇到運行服務,部署安裝時候無任何問題,后續再某個特殊時間點,突然服務無法啟動了。再次啟動時,提示端口占用與以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。 …

2020/12 JLPT聽力原文 問題二 3番

3番:レストランで、女の人と店長が話しています。店長はサラダについて、どんなアドバイスをしていますか。女:店長、この前話してた新しいランチメニューのサラダを作ってみたんですが、どうでしょうか。 男:ああ、サラダだけで満足できるっ…

芯片行業主要廠商

作為一個小白,每次淘寶買芯片時看到相似的命名規則:“OPA、AD、LT、MAX”等等時,我不禁好奇這些芯片行業大廠有哪些,所以查了些資料: 1. 德州儀器(Texas Instruments, TI) 公司概況&#xff1…

【BLE系列-第四篇】從零剖析L2CAP:信道、Credit流控、指令詳解

目錄 引言 一、L2CAP主要功能 二、L2CAP幀格式及信道概念 2.1 邏輯鏈路是什么? 2.2 邏輯信道的作用 2.3 L2CAP幀格式介紹 三、L2CAP信令信道 3.1 信令信道幀格式說明 3.2 信令信道指令介紹 3.2.1 信令信道指令一覽表 3.2.2 Credit流控規則 引言 在BLE協…

CSS保持元素寬高比,固定元素寬高比

方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">這里是正文內容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 寬高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …

數據分析小白訓練營:基于python編程語言的Numpy庫介紹(第三方庫)(上篇)

&#xff08;一&#xff09;Numpy庫的安裝安裝指定版本的Numpy庫&#xff0c;打開命令提示符&#xff0c;輸入下圖內容&#xff0c;只需要將1.25.5的版本修改成個人需要的版本&#xff0c;然后按下回車鍵&#xff0c;numpy庫就安裝在python中&#xff1a;指定版本numpy庫安裝可…

從 Windows 到 Linux 服務器的全自動部署教程(免密登錄 + 壓縮 + 上傳 + 啟動)

一、準備工作 1. 環境說明 本地開發環境&#xff1a;Windows 服務器&#xff08;需執行部署腳本&#xff09;目標服務器&#xff1a;Linux 服務器&#xff08;需安裝 node.js、pm2、unzip&#xff09;核心工具&#xff1a;7-Zip&#xff08;壓縮&#xff09;、OpenSSH&#x…

智能汽車領域研發,復用云原始開發范式?

汽車電子電氣架構演進趨勢&#xff1a;分散的功能ECU -> 域控制器 -> 中央計算服務器汽車電子方案與架構在發展與迭代時會使用虛擬化方法幾種可行的軟硬一體化方案&#xff1a;多ECU&#xff0c;硬件隔離&#xff0c;硬件分區&#xff0c;車規級多核硬件架構 Hypervisor…

數據電臺詢價的詢價要求

技術規格及主要參數 1.電臺基本要求&#xff1a; 1.1 電臺中的信號處理基于FPGA設計&#xff0c;采用FPGAARM高速AD/DA設計架構&#xff1b; 1.2 具備頻譜感知、自主選頻、跳頻、擴頻等功能&#xff1b; 1.3 具備鏈路質量信息、自組網路由信息、電池電壓監測信息、北斗定位信息…

IoT/HCIP實驗-5/基于WIFI的智慧農業實驗(LwM2M/CoAP+PSK+ESP8266 連接到 IoTDA)

文章目錄概述WIFI8266 通信模組WIFI模組也用AT指令&#xff1f;ESP8266 內置協議棧?支持的無線網絡模式MCU通過串口與模組交互Wifi模組做客戶端PC-AT接入路由器向本地TCP服務發數據用代碼接入你家路由器已接入AP&#xff08;你家Wifi&#xff09;平臺側開發工程配置和編譯工程…

定時器輸出PWM波配置(呼吸燈)

使用定時器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;實現呼吸燈效果。 頻率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499pwm.c:#include "pwm.h" // 本模塊頭文件&#xff1a;應聲明 pwm_init/pwm_compare_set 等原型、并包含 HAL 頭//&#xff08;示…

[ai-agent]環境簡介之沙盒e2b vs daytona

所謂的環境的就是agent運行在哪里&#xff0c;或者是agent和那里進行交互。 最常見的環境就是本地開發環境&#xff0c;也就是個人主機&#xff0c;但是存在問題就是沒有辦法出網和橫向擴展。 在沙盒之前也是有其他選擇的&#xff1a; 云服務器&#xff0c; 虛擬機&#xff0c;…

【前端面試題】前端面試知識點(第三十一題到第六十一題)

三十一. CSS實現垂直水平居中 實現元素的垂直水平居中是前端開發中的常見需求,主要有以下幾種思路: text-align + line-height實現單行文本水平垂直居中 適用于單行文本元素,通過text-align: center實現水平居中,line-height等于容器高度實現垂直居中 text-align + vertic…

嵌入式練習項目——————抓包獲取天氣信息

一、內容 嘗試通過實時天氣接口 - 數據接口 - NowAPI此網站獲取天氣信息&#xff0c;實現可以發送城市查詢當前天氣和未來天氣 二、獲取請求報文 可以根據測試示例看到獲取內容&#xff0c;此時數據是cJSON格式&#xff0c;我們首先要通過合適的網址抓包獲取到請求報文&#x…

Python爬蟲實戰:研究NewsCrawl ,構建新浪和網易新聞數據采集系統

1. 引言 1.1 研究背景與意義 在信息時代,新聞作為社會動態、公眾觀點的重要載體,其傳播速度與影響力持續擴大。傳統的人工篩選與采集方式已無法滿足對海量新聞數據的高效處理需求,亟需自動化工具實現大規模、結構化的新聞數據采集。網絡爬蟲技術作為一種按照預設規則自動抓…

PyTorch神經網絡工具箱全解析:nn.Module vs nn.functional

&#x1f50d; 為何需要神經網絡工具箱&#xff1f; 在僅用 Autograd 和 Tensor 實現模型時&#xff0c;開發者需手動設置參數梯度&#xff08;requires_gradTrue&#xff09;、反向傳播&#xff08;backward()&#xff09;及梯度提取&#xff0c;過程繁瑣且易出錯。nn 工具箱應…

Java注解學習記錄

目錄 一、為什么要學注解&#xff1f; 二、注解是什么&#xff1f; 三、為什么要使用注解&#xff1f; 四、注解的作用 五、注解的分類 5.1 元注解 Retention&#xff08;/ r??ten?(?)n /&#xff09; ★★★★★ Target ★★★★★ Inherited(/ ?n?her?t?d /…

43.安卓逆向2-補環境-使用unidbg(使用Smali語法調用方法和使用方法地址調用方法)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

【Kubernetes知識點問答題】Pod 調度

1. 如何將特定 Pod 調度到指定的節點&#xff1f;可以使用下列方法中的任何一種來選擇 K8s 對特定 Pod 的調度&#xff1a;① 與節點標簽匹配的 nodeSelector&#xff1a;在 Pod 的規范中使用 nodeSelector 字段來指定節點標簽&#xff0c;以便將 Pod 調度到具有特定標簽的節點…