動靜态庫的創建 | 使用 | 加載
發布時間:2024-01-25 13:47:47
動靜态庫的介紹
靜态庫( .a ):在程序編譯的時候,把庫的代碼鏈接(拷貝)到可執行程序。
動态庫(.so):在程序的執行時,鏈接動态庫的代碼。多個程序同時共享代碼。
創建一個靜态庫:
創建計算器,帶有加減乘除功能。
聲明和定義分離(lí)。創建文件
靜态庫的打包
一:生成 .o文件
爲了簡化操作,我們隻測試加法功能
創建testadd目錄 将Add.o文件移動到testadd目錄,創建一個簡單的test代碼
包含上層目錄的Add.h頭文件
将test.c文件編譯成test.o文件
因此用戶可以通過包含頭文件的形式 再編譯成可執行文件
因此通過将.o文件和.h文件打包給别人,别人就能使用庫。
這一個将.o文件拷貝編譯生成可執行可執行程序的過程就是(shì)靜态鏈接。
但(dàn)是(shì)有果有許多的.o文件,打包起來就很繁瑣,用戶使用也不舒服。
介紹第二種方式
二、借助ar指令簡化
1)生成靜态庫
ar是(shì)gun歸檔工具,常用于目标文件打包成靜态庫
r-c表示replace-create
指令:
生成靜态庫libmymath.a
通過 ar - tv指令查看靜态文件中的目錄列表
2)将頭文件和庫打包(發布)
将我們的庫給别人實際上是(shì)給出倆個文件。一個文件包含庫,一個文件包含頭文件
下面修改我們的Makefile自動化建構文件
創建mymath_lib目錄
底下包含倆個子目錄
include (用來放(fàng)頭文件)
lib(用來放(fàng)庫文件)
make構造
tree查看目錄mymath_lib
這樣就完成對靜态庫的創建,如果我們想發送出去(qù)。我們還可以進行cxz壓縮文件
靜态庫的使用
我們有一份靜态庫mymath_lib
在使用時,必須指明鏈接哪一個庫,哪個路徑
如果直接gcc編譯會出錯
原因是(shì)找不到庫 " "會再當前目錄下尋找文件,找不到再全系統目錄下尋找
将mymath_lib的頭文件和庫文件分别拷貝到系統目錄中系統頭文件一般在/user/include/路徑下系統庫文件一般放(fàng)在/lib64/路徑下然後編譯的時候通過 gcc 文件名 +l指明要鏈接的第三方庫的名稱不推薦的原因操作相(xiàng)對繁瑣,會污染系統庫,不想使用了需要自行删除
方法二:(推薦)
在gcc編譯時候 ,通過-I(小寫i) 和 L(大寫L)指定路徑和庫
動态庫的打包
動态庫的創建,大緻與靜态庫相(xiàng)同,有些許差異下面新建一個目錄,存放(fàng)計算器的四個.c和.h文件
第一步:生成.o文件并打包
生成.o文件之後,不再使用ar打包而是(shì)在gcc 選項之後添加shared下面依舊(jiù)利用自動化構建工具(先生成.o在整合生成.so)與靜态庫生成不同的是(shì),動态庫完全由gcc就能完成
第二步:發布
與靜态庫的生成一樣,需要将庫發布。發布就需要放(fàng)在同一個目錄下的倆個不同目錄下
創建庫目錄my_math_lib
子目錄 include放(fàng)頭文件
lib放(fàng)庫 .so
完善我們的自動化構建
增加output功能
tree一下結構
完成動态庫的制作和發布
動态庫的使用
在該路徑底下隻有動态庫文件和用戶.c文件