青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長網(wǎng)

17站長網(wǎng) 首頁 網(wǎng)站 服務器 查看內(nèi)容

詳解Linux動態(tài)庫生成與使用指南

2022-10-24 14:37| 查看: 2028 |來源: 互聯(lián)網(wǎng)

Linux下動態(tài)庫文件的文件名形如 libxxx.so,其中so是 Shared Object 的縮寫,即可以共享的目標文件。 在鏈接動態(tài)庫生成可執(zhí)行文件時,并不會把動態(tài)庫的代碼復制到執(zhí)行文件中,而是在執(zhí)行文件中記錄對動態(tài)庫的引用。

Linux下動態(tài)庫文件的文件名形如 libxxx.so,其中so是 Shared Object 的縮寫,即可以共享的目標文件。

在鏈接動態(tài)庫生成可執(zhí)行文件時,并不會把動態(tài)庫的代碼復制到執(zhí)行文件中,而是在執(zhí)行文件中記錄對動態(tài)庫的引用。

程序執(zhí)行時,再去加載動態(tài)庫文件。如果動態(tài)庫已經(jīng)加載,則不必重復加載,從而能節(jié)省內(nèi)存空間。

Linux下生成和使用動態(tài)庫的步驟如下:

  • 編寫源文件。
  • 將一個或幾個源文件編譯鏈接,生成共享庫。
  • 通過 -L -lxxx 的gcc選項鏈接生成的libxxx.so。
  • 把libxxx.so放入鏈接庫的標準路徑,或指定 LD_LIBRARY_PATH,才能運行鏈接了libxxx.so的程序。

下面通過實例詳細講解。

編寫源文件

建立一個源文件: max.c,代碼如下:

int max(int n1, int n2, int n3) { int max_num = n1; max_num = max_num < n2? n2: max_num; max_num = max_num < n3? n3: max_num; return max_num; }

編譯生成共享庫:

gcc -fPIC -shared -o libmax.so max.c

我們會得到libmax.so。

實際上上述過程分為編譯和鏈接兩步, -fPIC是編譯選項,PIC是 Position Independent Code 的縮寫,表示要生成位置無關(guān)的代碼,這是動態(tài)庫需要的特性; -shared是鏈接選項,告訴gcc生成動態(tài)庫而不是可執(zhí)行文件。

上述的一行命令等同于:

gcc -c -fPIC max.c gcc -shared -o libmax.so max.o

為動態(tài)庫編寫接口文件

為了讓用戶知道我們的動態(tài)庫中有哪些接口可用,我們需要編寫對應的頭文件。

建立 max.h ,輸入以下代碼:

#ifndef __MAX_H__ #define __MAX_H__ int max(int n1, int n2, int n3); #endif

測試,鏈接動態(tài)庫生成可執(zhí)行文件

建立一個使用max函數(shù)的test.c,代碼如下:

#include #include "max.h" int main(int argc, char *argv[]) { int a = 10, b = -2, c = 100; printf("max among 10, -2 and 100 is %d.\n", max(a, b, c)); return 0; }

gcc test.c -L. -lmax 生成a.out,其中-lmax表示要鏈接libmax.so。

-L.表示搜索要鏈接的庫文件時包含當前路徑。

注意,如果同一目錄下同時存在同名的動態(tài)庫和靜態(tài)庫,比如 libmax.so 和 libmax.a 都在當前路徑下,
則gcc會優(yōu)先鏈接動態(tài)庫。

運行

運行 ./a.out 會得到以下的錯誤提示。

./a.out: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory

找不到libmax.so,原來Linux是通過 /etc/ld.so.cache 文件搜尋要鏈接的動態(tài)庫的。
而 /etc/ld.so.cache 是 ldconfig 程序讀取 /etc/ld.so.conf 文件生成的。
(注意, /etc/ld.so.conf 中并不必包含 /lib 和 /usr/lib,ldconfig程序會自動搜索這兩個目錄)

如果我們把 libmax.so 所在的路徑添加到 /etc/ld.so.conf 中,再以root權(quán)限運行 ldconfig 程序,更新 /etc/ld.so.cache ,a.out運行時,就可以找到 libmax.so。

但作為一個簡單的測試例子,讓我們改動系統(tǒng)的東西,似乎不太合適。

還有另一種簡單的方法,就是為a.out指定 LD_LIBRARY_PATH。

LD_LIBRARY_PATH=. ./a.out

程序就能正常運行了。LD_LIBRARY_PATH=. 是告訴 a.out,先在當前路徑尋找鏈接的動態(tài)庫。

對于elf格式的可執(zhí)行程序,是由ld-linux.so*來完成的,它先后搜索elf文件的 DT_RPATH 段, 環(huán)境變量 LD_LIBRARY_PATH, /etc/ld.so.cache文件列表, /lib/,/usr/lib目錄, 找到庫文件后將其載入內(nèi)存.

makefile讓工作自動化

編寫makefile,內(nèi)容如下:

.PHONY: build test clean build: libmax.so libmax.so: max.o gcc -o $@ -shared $< max.o: max.c gcc -c -fPIC $< test: a.out a.out: test.c libmax.so gcc test.c -L. -lmax LD_LIBRARY_PATH=. ./a.out clean: rm -f *.o *.so a.out

make build就會生成libmax.so, make test就會生成a.out并執(zhí)行,make clean會清理編譯和測試結(jié)果。

本文最后更新于 2022-10-24 14:37,某些文章具有時效性,若有錯誤或已失效,請在網(wǎng)站留言或聯(lián)系站長:17tui@17tui.com
·END·
站長網(wǎng)微信號:w17tui,關(guān)注站長、創(chuàng)業(yè)、關(guān)注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識,文章和圖片版權(quán)歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系我們及時修正或刪除。謝謝!

17站長網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務,與站長一起進步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨!

掃一掃,關(guān)注站長網(wǎng)微信

大家都在看

熱門排行

    最近更新

      返回頂部
      主站蜘蛛池模板: 善良的小峓子2在钱中文版女主角 | 漂亮的保姆5电影免费观看完整版中文 | 高清国语自产拍在线 | 久草国产在线播放 | 国产福利不卡在线视频 | 国内精品国内自产视频 | 快播最新电影网站 | 成人亚洲乱码在线 | 成年人视频免费在线观看 | 少妇系列之白嫩人妻 | 肉肉高潮液体高干文H | 无码国产色欲XXXX视频 | 99re久久这里只有精品 | 噜噜噜狠狠夜夜躁精品 | 国产一区日韩二区欧美三区 | 福利社影院 | 韩国精品无码少妇在线观看网站 | 亚洲国产三级在线观看 | 狠狠色香婷婷久久亚洲精品 | 中文在线观看 | 麻豆精品传媒2021网站入口 | 色戒在线完整观看在线播放版 | 99久久亚洲精品日本无码 | 肉动漫无修在线播放 | 高清 仑乱 一级 a | 考好老师让你做一次H | 男生脱美女内裤内衣动态图 | 99在线观看免费视频 | 甜性涩爱dvd | 野花社区WWW韩国日本 | 嗯啊…嗯np男男双性总受 | 超碰在线线公开免费视频 | 99精品热视频30在线热视频 | 最近更新2019中文字幕国语 | 亚洲国产精品第一影院在线观看 | 2020亚洲国产在线播放在线 | 2019中文字幕乱码免费 | 国偷自产AV一区二区三区健身房 | 亚洲欧洲精品成人久久曰影片 | 强壮的公次次弄得我高潮韩国电影 | 亚洲一区免费香蕉在线 |