【Linux庖丁解牛】— 動靜態庫的制作和使用!

1. 什么是庫

庫是寫好的現有的,成熟的,可以復?的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能 每個?的代碼都從零開始,因此庫的存在意義?同尋常。 本質上來說庫是?種可執?代碼的?進制形式,可以被操作系統載?內存執?。庫有兩種:

? 靜態庫 .a[Linux]、.lib[windows]

? 動態庫 .so[Linux]、.dll[windows]

2. 靜態庫

在當前目錄下,有以上兩個我們寫的.h文件和對應的.c文件。在test文件當中包含了我們使用的頭文件,如果我們希望test文件編譯鏈接形成可執行文件,直接gcc的話則會報錯!

我們先把所有的.c文件編譯形成.o文件,然后再鏈接所有的.o文件就可以形成可執行文件了。?

所以我們可以得出結論結論:所有的庫【動態庫、靜態庫】其本質都是源文件對應的.o文件!

不過,我們寫的庫終究還是要給別人使用,如果我們每次都是把許多.o文件給別人,讓別人鏈接這么多的.o文件,那這也太麻煩了,所以在Linux中,我們有一個轉門針對這個問題的打包命令ar【archive 、r 是 gnu 歸檔?具, rc 表? (replace and create)?靜態庫的本質就是.o打了一個包。

假設在張三目錄下,我們需要用到我們設計的庫,那我們可以我們的庫打包拷貝給他,并同時把我們的頭文件拷貝給他,這樣張三就可以更方便的使用了。

需要解釋一下指令gcc -o test test.c -L . -l myc中的選項,-L表示在哪個路徑下找庫【編譯器默認在路徑/usr/lib64查找庫】,-l表示我們要找的庫的名字。對于庫名libmyc.a來說前綴lib和后綴.a是固定的,myc表示真實有效的命名。如果我們要連接所有的非C/C++標準庫【包括外部或我們自己寫的】,都需要指明-L和-l。不過,如果我們將這些庫提前安裝【也就是拷貝】到系統當中,其實我們也不需要指明路徑了。其實,還有一個-I選項來指明我們需要的頭文件,只不過這里默認在當前路徑下找就不需要特殊指明了。

3. 動態庫

下面簡單制作了一個Makefile文件方便動態庫的生成打包和垃圾文件的清理。

可以看到,在操作方面和靜態庫相比,不同的地方在于,我們都是使用gcc編譯器,形成.o文件時,我們需要增加一個選項-fPIC,在打包文件時,我們需要增加一個選項-shared【動態庫也叫共享庫】。?

? shared:表??成共享庫格式

? fPIC:產?位置?關碼(position independent code),這里先不解釋。

? 庫名規則:libxxx.so

下面我已經把打包好的動態庫和頭文件拷貝給張三目錄下,我們編譯鏈接動態庫可以成功生成可執行文件test,但是在執行該文件時卻發生了問題:找不到動態庫!

?test所依賴的libmyc.so庫果然沒有找到。

解釋:當我們在編譯形成可執行文件時,我們只告訴了編譯器gcc我們的動態庫在哪里,叫什么,而并沒有讓系統知道我們的動態庫在哪里叫什么!而可執行文件在運行時,需要知道動態庫的路徑和名字。

那這里就有一個問題了:為什么靜態庫在編譯鏈接形成可執行后,就可以直接運行了,沒有找不到庫的問題????

那是因為,靜態庫在編譯鏈接時就把靜態庫文件拷貝到了可執行文件當中,當我們運行時就不再依賴庫了,程序直接加載到內存當中就可以運行。而動態庫在形成程序加載到內存當中運行時,依然需要找到對應的動態庫!

解決辦法:

>系統會默認在指定路徑下【一般來說在這個路徑/lib64/】尋找對應的庫文件,所以最簡單粗暴的方法就是把我們的動態庫拷貝到對應的路徑【系統安裝動態庫】下。

>第二種方法就是給我們的庫在系統路徑下建立軟鏈接,讓軟鏈接執向我們的庫。

>第三種做法就是導環境變量的方法:系統不僅會在默認的路徑下尋找動態庫,還會根據環境變量中的LD_LIBRARY_PATH路徑下尋找動態庫,所以我們可以把我們庫的路徑導入到這個環境變量中。

>第四種做法就是修改相關的配置文件,先看操作:

我們將動態庫所在的路徑拷貝到文件/etc/ld.so.conf.d/mylib.conf中,其中,文件mylib.conf是我們自己隨便新建的。

接下來,我們完成這個命令即可:【要?效,這里要執行ldconfig,重新加載庫搜索路徑】

4. 一些小問題

上面,我們初步了解了我們什么是動靜態庫以及它們的生成和使用的相關操作,下面有一些小問題。

>如果我們為程序同時提供動靜態庫,編譯器會怎么做呢?

答:gcc/g++編譯器會默認使用動態庫!

>那如果,我們非要使用靜態庫鏈接,如何辦到呢?

答:在編譯時帶上-static選項!不過,如果沒有靜態庫,編譯時則會報錯!

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

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

相關文章

Hadoop集群啟動 (ZooKeeper、HDFS、YARN、Hbase)

一、啟動ZooKeeper集群 sh /opt/modules/zookeeper-3.4.14/bin/zkServer.sh start[hadoopcentos01 ~]$ sh /opt/modules/zookeeper-3.4.14/bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/modules/zookeeper-3.4.14/bin/../conf/zoo.cfg Startin…

React Hooks全面解析:從基礎到高級的實用指南

React Hooks全面解析:從基礎到高級的實用指南 React Hooks自2018年16.8版本引入以來,徹底改變了React組件的開發方式。** Hooks使函數組件獲得了與類組件同等的表達能力,同時簡化了代碼結構,提升了可維護性**。本文將系統介紹Rea…

LINUX75 LAMP

LAMP 環境 yum NetworkManager systemctl status firewalld setenforce 0 Last login: Fri Jul 4 19:21:47 2025 from 192.168.235.1 [rootweb ~]# cd /usr/local/apache2/conf/ [rootweb conf]# ls extra httpd.conf httpd.conf.bak magic mime.types original [root…

cloudflare配合github搭建免費開源影視LibreTV一個獨享視頻網站 詳細教程

一、項目簡介 LibreTV 是一個開源的 IPTV/影視聚合前端項目,支持 M3U 播放列表、EPG 電子節目單等。它本身是純前端項目,非常適合用 GitHub Pages Cloudflare 免費托管。 二、準備工作 GitHub 賬號 注冊并登錄 GitHub Cloudflare 賬號 注冊并登錄 …

Linux/Unix進程概念及基本操作(PID、內存布局、虛擬內存、環境變量、fork、exit、wait、exec、system)

進程 文章目錄 進程I 進程基本概念1、進程和程序2、進程號和父進程號3、進程內存布局4、虛擬內存管理(1)程序的兩種局部性(2)虛擬內存的規劃(3)虛擬內存的優點 5、棧和棧幀6、命令行參數argc和argv7、環境變…

0基礎學Python系列【25】 單元測試入門教程

大家好,歡迎來到Python學習的第三站!?? 這部分會涉及一些Python的進階技術,雖然不一定是必需的,但學會這些,你會覺得編程更得心應手。 本章要學什么? Python調試器(pdb)裝飾器lambda函數代碼性能分析單元測試入門 —— 今天講這里聽起來有點多?別擔心,我們慢慢來,…

iOS常見內存錯誤碼

一、經典十六進制錯誤碼0xDEADBEEF(EXC_BAD_ACCESS) 含義:野指針訪問(訪問已釋放的內存地址)。 記憶點:“DEAD BEEF” 可理解為 “死亡牛肉”,象征指針指向的內存已 “死亡”。 觸發場景&#x…

CSS01:CSS的快速入門及優勢

CSS快速入門 style 練習格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS</title><!-- 規范,<style>可以編寫css代碼,每一個聲明最好用分號結尾語法&#xff1a;…

springsecurity5配置之后啟動項目報錯:authenticationManager cannot be null

目錄 配置代碼 報錯信息 解決辦法 配置代碼 下面的配置為響應式的配置方式 //這個配置只是配置springboot admin的一個例子,具體的配置可能比較復雜 @EnableWebFluxSecurity public class SecurityConfig {private final AdminServerProperties adminServer;public Securi…

攻防世界-Rerverse-game

知識點 1.ida逆向 2.函數分析逆向 步驟 用Exeinfo打開&#xff0c;為32位exe文件。 方法一&#xff1a; 玩游戲通關&#xff0c;根據游戲規則&#xff0c;m1&#xff0c;n依次為1到8即可得到flag。 方法二&#xff1a; 用32位IDA打開 ctrlF搜索main&#xff0c;點擊_main,…

openEuler 24.03 全流程實戰:用 Ansible 5 分鐘部署分布式 MinIO 高可用集群

目錄 0 | 為什么要寫這篇教程&#xff1f; 1 | 準備工作 1.1 控制節點手工下載 MinIO 1.2 SSH 互信&#xff08;可跳過&#xff0c;本教程已有互信&#xff09; 1.3 安裝 Ansible & SELinux 依賴 2 | 項目目錄 3 | Inventory hosts.ini 4 | 變量文件 group_vars/al…

最左匹配原則

導讀&#xff1a; 首先創建一張 test 表&#xff0c;并插入一些數據&#xff1a; CREATE TABLE test ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 主鍵, a int(11) NOT NULL, b int(11) NOT NULL, c int(11) NOT NULL, d int(11) NOT NULL, PRIMARY KEY (id), KEY idx_abc …

MySQL 8.0 OCP 1Z0-908 題目解析(17)

題目65 Choose two. Which two are characteristics of snapshot-based backups? □ A) The frozen file system can be cloned to another virtual machine immediately into active service. □ B) There is no need for InnoDB tables to perform its own recovery when re…

Level2_12小球與擋板(移動+反彈)

一、前引 #已經學習完了: #1.數據結構&#xff1a;集合、元組、字典 #2.函數 #3.類和對象 #4.繼承與多態 #1.規劃編程項目: #&#xff08;1&#xff09;你想做什么什么樣功能的項目&#xff1f; # 接小球游戲,碰到擋板時自動反彈 #&#xff08;2&#xff09;功能有哪些&#x…

win11 2025開機禁用微軟賬號登錄,改本地用戶登錄,品牌預裝機福音

今天開箱了品牌商出廠系統一臺華為筆記本&#xff0c;開機提示連接wifi并需要登錄微軟賬號&#xff0c;其中過程實在緩慢&#xff0c;而且老是提示自動更新&#xff0c;速度太慢了&#xff0c;等的花都謝了&#xff0c;進到桌面大概得要30-40分鐘&#xff0c;還不如本地用戶登錄…

【嵌入式ARM匯編基礎】-ELF文件格式內部結構詳解(三)

ELF文件格式內部結構詳解(三) 文章目錄 ELF文件格式內部結構詳解(三)12、動態部分和動態加載13、依賴加載(需要)14、程序重定位14.1 靜態重定位14.2 動態重定位14.3 全局偏移表 (GOT)14.4 過程鏈接表 (PLT)12、動態部分和動態加載 ELF 文件格式中的 .dynamic 部分用于指…

HTML知識復習2

文章目錄 HTML5簡介什么是HTML5HTML5優勢 新增語義化標簽新增布局標簽新增狀態標簽新增列表標簽新增文本標簽 新增表單功能表單控件新增屬性input新增屬性值 新增多媒體標簽視頻標簽音頻標簽 HTML5兼容性處理 HTML5簡介 什么是HTML5 HTML5 是新一代的 HTML 標準&#xff0c;2…

棧(Stack)和隊列(Queue)

文章目錄 前言1. 棧(Stack)1.1 什么是棧1.2 棧的常用操作1.3 棧的模擬實現1.4 棧的應用場景1.4.1 元素序列處理1.4.2 字符串反轉1.4.3 括號匹配1.4.4 逆波蘭表達式求值1.4.5 棧的壓入、彈出序列1.4.6 最小棧1.4.7 遞歸轉循環 1.5 概念區分1.5.1 數據結構中的棧1.5.2 JVM中的虛擬…

5G MEC四大核心挑戰技術解析報告

一、MEC園區部署挑戰:數據本地化與低時延接入 痛點深度解析 數據不出園區:工業質檢、醫療影像等敏感業務需數據在本地閉環處理。但運營商基站與企業MEC間若經公網繞行,時延超50ms且存在泄露風險。L2網絡局限:傳統L2接入網無法實現基站→UPF的智能路由,導致業務流繞行城域…

【硬核拆解】英偉達Blackwell芯片架構如何重構AI算力邊界?

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 一、Blackwell誕生的算力危機&#xff08;2025現狀&#xff09; graph TD A[2025年AI算力需求] --> B[千億參數模型訓練能耗…