Linux系统上的库文件的生成与使用
1.什么是庫(kù)文件
庫(kù)是一組預(yù)先編譯好的方法的集合。Linux系統(tǒng)存儲(chǔ)的庫(kù)的位置一般在:/lib 和 /usr/lib。
在 64 位的系統(tǒng)上有些庫(kù)也可能被存儲(chǔ)在/usr/lib64 下。庫(kù)的頭文件一般會(huì)被存儲(chǔ)在/usr/include 下或其子目錄下。
庫(kù)有兩種,一種是靜態(tài)庫(kù),其命令規(guī)則為 libxxx.a,一種是共享庫(kù),其命令規(guī)則為 libxxx.so,
如下圖所示:
2.靜態(tài)庫(kù)的生成與使用
2.1 靜態(tài)庫(kù)的生成
首先看add.c、max.c、foo.h的內(nèi)容
第一步:先將需要生成庫(kù)文件的所有“.c“文件編譯成“.o”文件。
第二步:使用 ar 命令將第一步編譯的所有”.o”文件生成靜態(tài)庫(kù),其中:
c 是創(chuàng)建庫(kù)
r 是將方法添加到庫(kù)中
v 顯示過(guò)程
2.2 靜態(tài)庫(kù)的使用
首先看以下用到我們生成的庫(kù)文件的main.c文件內(nèi)容
以下是使用靜態(tài)庫(kù)“l(fā)ibfoo.a”和“main.c”生成可執(zhí)行文件的過(guò)程,其中:
-L 指定庫(kù)的存儲(chǔ)路徑
-l 指定庫(kù)的名稱(不需要前面的‘lib’和擴(kuò)展名‘.a’)
3、共享庫(kù)的生成與使用
3.1 共享庫(kù)的生成
以下是需要生成共享庫(kù)的”.c”文件,其中“foo.h”中是函數(shù)的聲明,“add.c”和“max.c”是函數(shù)的定義:
第一步:先將需要生成庫(kù)文件的所有“.c“文件編譯成“.o”文件
第二步:使用 gcc 命令將第一步編譯的所有”.o”文件生成共享庫(kù)
3.2 共享庫(kù)的使用
以下是使用共享庫(kù)“l(fā)ibfoo.so”和“main.c”生成可執(zhí)行文件的過(guò)程,其中 -L 指定庫(kù)的存儲(chǔ)路徑, -l 指定庫(kù)的名稱(不需要前面的‘lib’和擴(kuò)展名‘.so’), 如果在庫(kù)的存儲(chǔ)路徑有同名的共享庫(kù)和靜態(tài)庫(kù),gcc 默認(rèn)使用共享庫(kù)。(注意在這里刪除了靜態(tài)庫(kù)libfoo.a)
生成之后,直接執(zhí)行 main 程序,發(fā)現(xiàn)出錯(cuò),原因是系統(tǒng)加載共享庫(kù)時(shí),找不到對(duì)應(yīng)的共享庫(kù)文件”libfoo.so”, 但是該庫(kù)確實(shí)在當(dāng)前目錄下存在。
這是為什么呢?因?yàn)橄到y(tǒng)默認(rèn)只會(huì)去存儲(chǔ)庫(kù)的標(biāo)準(zhǔn)位置(/lib 或/usr/lib 等)加載,而不會(huì)在當(dāng)前位置尋找。所以將庫(kù)拷貝到/usr/lib 下,再執(zhí)行程序,就可以成功。如果庫(kù)不在標(biāo)準(zhǔn)位置下,也可以通過(guò)設(shè)置環(huán)境變量”LD_LIBRARY_PATH”來(lái)指定加載庫(kù)的路徑。
把共享庫(kù)放到/usr/lib下面:
ldd指令可以看執(zhí)行文件用到了哪些共享庫(kù),執(zhí)行成功。
4、靜態(tài)庫(kù)和共享庫(kù)的區(qū)別
靜態(tài)庫(kù)在鏈接時(shí)將用到的方法包含到最終生成的可執(zhí)行程序中,而共享庫(kù)不包含,只做標(biāo)記,在運(yùn)行程序時(shí),才動(dòng)態(tài)加載。
總結(jié)
以上是生活随笔為你收集整理的Linux系统上的库文件的生成与使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gdb调试的用法
- 下一篇: Linux信号的使用