日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态库(共享库)的制作和使用

發(fā)布時間:2023/11/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态库(共享库)的制作和使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?Linux下的動態(tài)庫為lib*.so格式的二進(jìn)制文件(目標(biāo)文件),對應(yīng)于Windows下的.dll格式的文件。

1)命名規(guī)則

lib+庫名+.so

2)動態(tài)庫的制作

1)生成與位置無關(guān)的代碼(.o)? 2)將.o文件打包成動態(tài)庫(共享庫)

? ? ? ? 仍然以上篇文章的代碼為例。

[root@localhost src]# gcc -fPIC -c *.c?
[root@localhost src]# ls
add.c ?add.o ?div.c ?div.o ?mul.c ?mul.o ?sub.c ?sub.o? ? ? //這幾個.o文件已經(jīng)是庫函數(shù)了,它們是與位置無關(guān)的代碼。PIC可以小寫也可以大寫,表示生成與位置無關(guān)的代碼。

[root@localhost src]# gcc -shared *.o -o libMytest.so
[root@localhost src]# ls
add.c ?add.o ?div.c ?div.o ?libMytest.so ?mul.c ?mul.o ?sub.c ?sub.o? ?// 將所有.o文件打包到動態(tài)庫libMytest.so中

3)發(fā)布和使用動態(tài)庫(共享庫)

ldd命令用來顯示二進(jìn)制代碼文件動態(tài)庫的鏈接情況,如:ldd foo。將生成的libMytest.so庫文件和頭文件head.h發(fā)送給客服,客服就可以根據(jù)頭文件中的接口情況,來知道庫文件的功能 (具體怎么實現(xiàn)的他也不知道),從而客服就可以使用庫文件來完成自己的工作了(main.c):

[root@localhost Calc]# gcc -pedantic -Wall -pipe main.c -I include/ -L src/ -lMytest -o zsx? ?//等價于:?gcc -pedantic -Wall -pipe main.c -I include/ src/libMytest.so -o zsx
[root@localhost Calc]# ls
include ?lib ?main.c ?src ?zsx
[root@localhost Calc]# ldd zsx
?? ?linux-vdso.so.1 => ?(0x00007ffffa7e8000)
?? ?libMytest.so => not found
?? ?libc.so.6 => /lib64/libc.so.6 (0x00007f591dc98000)
?? ?/lib64/ld-linux-x86-64.so.2 (0x00007f591e078000)? ? //??ld-linux-x86-64.so.2為動態(tài)鏈接器庫文件(二進(jìn)制文件),程序在執(zhí)行時,動態(tài)庫的調(diào)用需要動態(tài)鏈接器(一個程序,二進(jìn)制代碼文件)來進(jìn)行調(diào)用。動態(tài)鏈接器是按照一定的規(guī)則去查找動態(tài)庫文件的,即按照動態(tài)庫的環(huán)境變量中的每個路徑依次進(jìn)行查找。Linux系統(tǒng)的/lib中就存放了系統(tǒng)在啟動時候就需要用到的一些動態(tài)庫。由ldd zsx可以看出,動態(tài)鏈接器無法找到代碼所需要的動態(tài)庫文件,即該動態(tài)庫文件不在動態(tài)鏈接器的搜索路徑中,下面給出幾種解決方法:

1.將庫文件libMytest.so放在/lib中就可以了,這樣鏈接器就可以找到該庫文件。但是,不建議這樣做,因為是系統(tǒng)的庫文件目錄,如果名字沖突就會發(fā)生故障。

2.設(shè)置環(huán)境變量LD_LIBRARY_PATH的值。

[root@localhost Calc]# echo $LD_LIBRARY_PATH

[root@localhost Calc]# export LD_LIBRARY_PATH=/mnt/hgfs/share/gcc/Calc/src/libMytest.so
[root@localhost Calc]# echo $LD_LIBRARY_PATH
/mnt/hgfs/share/gcc/Calc/src/libMytest.so

此時鏈接器會首先在環(huán)境變量LD_LIBRARY_PATH中查找?guī)煳募?#xff0c;沒有在去其余環(huán)境變量中查找。該方法也只是臨時有效,當(dāng)關(guān)閉終端后,環(huán)境變量LD_LIBRARY_PATH的值又恢復(fù)了空值,因此又需要再次設(shè)置!這種方法僅適用于:在開發(fā)測試動態(tài)庫過程中使用,因為僅僅臨時有效。在測試開發(fā)完成后,就需要一種穩(wěn)定的方法。

3.修改當(dāng)前用戶的bash配置文件:~/.bashrc? 修改完成后,需要關(guān)閉終端然后再次啟用終端,該配置才會生效。

[root@localhost ~]# vim ~/.bashrc

export LD_LIBRARY_PATH=/mnt/hgfs/share/gcc/Calc/src

重啟終端:

[root@localhost ~]# echo $LD_LIBRARY_PATH
/mnt/hgfs/share/gcc/Calc/src
即:? 該路徑永久生效

4.修改動態(tài)鏈接器的配置文件:/etc/ld.so.conf。將動態(tài)庫的路徑寫到配置文件中,將libMytest.so所在絕對路徑追加入到/etc/ld.so.conf文件;使用ldconfig -v 更新,使配置生效。

[root@localhost ~]# vim /etc/ld.so.conf
/mnt/hgfs/share/gcc/Calc/src

[root@localhost ~]# ldconfig -v

總結(jié):

1).放到系統(tǒng)的庫目錄中 -- 不允許使用

2).臨時測試

環(huán)境變量: LD_LIBRARY_PATH=將動態(tài)庫的路徑設(shè)置給該變量

將設(shè)置的值, 導(dǎo)入到系統(tǒng)環(huán)境變量中: export LD_LIBRARY_PATH

當(dāng)終端關(guān)閉, 設(shè)置會失效

3).不常用的方法(永久設(shè)置):

在家目錄的 .bashrc文件 中添加一句話: export LD_LIBRARY_PATH=動態(tài)庫目錄的絕對路徑

.bashrc修改完成, 需要重啟終端

4).常用的方法(永久設(shè)置)

1. 需要找動態(tài)連接器的配置文件 --? /etc/ld.so.conf

2. 動態(tài)庫的路徑寫到配置文件中

3. 更新 ldconfig –v? v參數(shù)表示顯示更新過程的詳細(xì)信息

(4)動態(tài)庫的優(yōu)缺點

優(yōu)點:執(zhí)行程序體積小;動態(tài)庫更新了,在接口不變的情況下,不需要重新編譯程序,只需要保證新庫跟舊庫名稱一樣,接口一樣,且新庫能夠被鏈接器找的到;

缺點:在發(fā)布最終版本的應(yīng)用程序時,需要將動態(tài)庫提供給客服;

總結(jié)

以上是生活随笔為你收集整理的动态库(共享库)的制作和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。