動靜態(tài)庫的介紹
靜態(tài)庫( .a ):在程序編譯的時候,把庫的代碼鏈接(拷貝)到可執(zhí)行程序。
動態(tài)庫(.so):在程序的執(zhí)行時,鏈接動態(tài)庫的代碼。多個程序同時共享代碼。
創(chuàng)建一個靜態(tài)庫:
創(chuàng)建計算器,帶有加減乘除功能。
聲明和定義分離。創(chuàng)建文件

靜態(tài)庫的打包
一:生成 .o文件

為了簡化操作,我們只測試加法功能
創(chuàng)建testadd目錄 將Add.o文件移動到testadd目錄,創(chuàng)建一個簡單的test代碼
包含上層目錄的Add.h頭文件

將test.c文件編譯成test.o文件
因此用戶可以通過包含頭文件的形式 再編譯成可執(zhí)行文件

因此通過將.o文件和.h文件打包給別人,別人就能使用庫。
這一個將.o文件拷貝編譯生成可執(zhí)行可執(zhí)行程序的過程就是靜態(tài)鏈接。
但是有果有許多的.o文件,打包起來就很繁瑣,用戶使用也不舒服。
介紹第二種方式
二、借助ar指令簡化
1)生成靜態(tài)庫
ar是gun歸檔工具,常用于目標文件打包成靜態(tài)庫
r-c表示replace-create
指令:

生成靜態(tài)庫libmymath.a

通過 ar - tv指令查看靜態(tài)文件中的目錄列表


2)將頭文件和庫打包(發(fā)布)
將我們的庫給別人實際上是給出倆個文件。一個文件包含庫,一個文件包含頭文件
下面修改我們的Makefile自動化建構(gòu)文件
創(chuàng)建mymath_lib目錄
底下包含倆個子目錄
include (用來放頭文件)
lib(用來放庫文件)

make構(gòu)造

tree查看目錄mymath_lib

這樣就完成對靜態(tài)庫的創(chuàng)建,如果我們想發(fā)送出去。我們還可以進行cxz壓縮文件
靜態(tài)庫的使用
我們有一份靜態(tài)庫mymath_lib
在使用時,必須指明鏈接哪一個庫,哪個路徑
如果直接gcc編譯會出錯
原因是找不到庫 " "會再當前目錄下尋找文件,找不到再全系統(tǒng)目錄下尋找

將mymath_lib的頭文件和庫文件分別拷貝到系統(tǒng)目錄中系統(tǒng)頭文件一般在/user/include/路徑下系統(tǒng)庫文件一般放在/lib64/路徑下然后編譯的時候通過 gcc 文件名 +l指明要鏈接的第三方庫的名稱不推薦的原因操作相對繁瑣,會污染系統(tǒng)庫,不想使用了需要自行刪除
方法二:(推薦)
在gcc編譯時候 ,通過-I(小寫i) 和 L(大寫L)指定路徑和庫

動態(tài)庫的打包
動態(tài)庫的創(chuàng)建,大致與靜態(tài)庫相同,有些許差異

第一步:生成.o文件并打包

生成.o文件之后,不再使用ar打包而是在gcc 選項之后添加shared下面依舊利用自動化構(gòu)建工具(先生成.o在整合生成.so)與靜態(tài)庫生成不同的是,動態(tài)庫完全由gcc就能完成

第二步:發(fā)布
與靜態(tài)庫的生成一樣,需要將庫發(fā)布。發(fā)布就需要放在同一個目錄下的倆個不同目錄下
創(chuàng)建庫目錄my_math_lib
子目錄 include放頭文件
lib放庫 .so
完善我們的自動化構(gòu)建
增加output功能

tree一下結(jié)構(gòu)

完成動態(tài)庫的制作和發(fā)布
動態(tài)庫的使用
在該路徑底下只有動態(tài)庫文件和用戶.c文件
