午夜网站国产欧美_加勒比视频亚洲无码_91亚洲人人在字幕国产_18禁止美女爆乳免费网站_被消防员c哭高h野外糙汉动漫_午夜精品视频在线无码_gogowww人体大胆裸体午液_2021自拍偷区亚洲综合第一页_国产欧美一区二区精品性色超碰_99國產精品無碼

Hi,您好,歡迎來(lái)到西安盛圖軟件科技有限公司!

動(dòng)靜態(tài)庫(kù)的創(chuàng)建 | 使用 | 加載

發(fā)布時(shí)間:2024-01-25 13:47:47

動(dòng)靜態(tài)庫(kù)的介紹

靜態(tài)庫(kù)( .a ):在程序編譯的時(shí)候,把庫(kù)的代碼鏈接(拷貝)到可執(zhí)行程序。

動(dòng)態(tài)庫(kù)(.so):在程序的執(zhí)行時(shí),鏈接動(dòng)態(tài)庫(kù)的代碼。多個(gè)程序同時(shí)共享代碼。

創(chuàng)建一個(gè)靜態(tài)庫(kù):
創(chuàng)建計(jì)算器,帶有加減乘除功能。

聲明和定義分離。創(chuàng)建文件

靜態(tài)庫(kù)的打包

一:生成 .o文件

為了簡(jiǎn)化操作,我們只測(cè)試加法功能

創(chuàng)建testadd目錄 將Add.o文件移動(dòng)到testadd目錄,創(chuàng)建一個(gè)簡(jiǎn)單的test代碼

包含上層目錄的Add.h頭文件

將test.c文件編譯成test.o文件 

因此用戶可以通過(guò)包含頭文件的形式 再編譯成可執(zhí)行文件 

因此通過(guò)將.o文件和.h文件打包給別人,別人就能使用庫(kù)。

這一個(gè)將.o文件拷貝編譯生成可執(zhí)行可執(zhí)行程序的過(guò)程就是靜態(tài)鏈接。

但是有果有許多的.o文件,打包起來(lái)就很繁瑣,用戶使用也不舒服。

介紹第二種方式

二、借助ar指令簡(jiǎn)化

1)生成靜態(tài)庫(kù)

ar是gun歸檔工具,常用于目標(biāo)文件打包成靜態(tài)庫(kù)

r-c表示replace-create

指令:

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

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

2)將頭文件和庫(kù)打包(發(fā)布)

將我們的庫(kù)給別人實(shí)際上是給出倆個(gè)文件。一個(gè)文件包含庫(kù),一個(gè)文件包含頭文件
使用者只需要包含頭文件就能使用我們的庫(kù)文件

下面修改我們的Makefile自動(dòng)化建構(gòu)文件

創(chuàng)建mymath_lib目錄

底下包含倆個(gè)子目錄

include (用來(lái)放頭文件)

lib(用來(lái)放庫(kù)文件)

make構(gòu)造

tree查看目錄mymath_lib

這樣就完成對(duì)靜態(tài)庫(kù)的創(chuàng)建,如果我們想發(fā)送出去。我們還可以進(jìn)行cxz壓縮文件


靜態(tài)庫(kù)的使用

我們有一份靜態(tài)庫(kù)mymath_lib

在使用時(shí),必須指明鏈接哪一個(gè)庫(kù),哪個(gè)路徑

如果直接gcc編譯會(huì)出錯(cuò)

原因是找不到庫(kù)     " "會(huì)再當(dāng)前目錄下尋找文件,找不到再全系統(tǒng)目錄下尋找

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

方法二:(推薦)

在gcc編譯時(shí)候 ,通過(guò)-I(小寫i) 和 L(大寫L)指定路徑和庫(kù)

動(dòng)態(tài)庫(kù)的打包

動(dòng)態(tài)庫(kù)的創(chuàng)建,大致與靜態(tài)庫(kù)相同,有些許差異
下面新建一個(gè)目錄,存放計(jì)算器的四個(gè).c和.h文件

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

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

第二步:發(fā)布

與靜態(tài)庫(kù)的生成一樣,需要將庫(kù)發(fā)布。發(fā)布就需要放在同一個(gè)目錄下的倆個(gè)不同目錄下

創(chuàng)建庫(kù)目錄my_math_lib

子目錄 include放頭文件

            lib放庫(kù) .so

完善我們的自動(dòng)化構(gòu)建

增加output功能

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

完成動(dòng)態(tài)庫(kù)的制作和發(fā)布

動(dòng)態(tài)庫(kù)的使用

在該路徑底下只有動(dòng)態(tài)庫(kù)文件和用戶.c文件

上一篇:面試官:分庫(kù)分表后如何生成全局 ID?
下一篇:C++性能優(yōu)化大局觀

歡迎登錄盛圖科技

歡迎注冊(cè)盛圖科技

已有賬號(hào),立即登錄