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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态库和动态库详解(部分参考别人)

發布時間:2024/4/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态库和动态库详解(部分参考别人) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

靜態庫和動態庫的區別

1.?靜態函數庫

????這類庫的名字一般是libxxx.a;利用靜態函數庫編譯成的文件比較大,因為整個?函數庫的所有數據都會被整合進目標代碼中,他的優點就顯而易見了,即編譯后的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函數庫改變了,那么你的程序必須重新編譯。

2.?動態函數庫

????這類庫的名字一般是libxxx.so;相對于靜態函數庫,動態函數庫在編譯的時候?并沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫里的相應函數,因此動態函數庫所產生的可執行文件比較小。由于函數庫沒有被整合進你的程序,而是程序運行時動態的申請并調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變并不影響你的程序,所以動態函數庫的升級比較方便。
linux系統有幾個重要的目錄存放相應的函數庫,如/lib?/usr/lib。

?

?

動態庫制作

實例說明:

假設當前目錄有一下文件:

/main.c//#include<math2.h>頭文件是我自己的

??1?#include<stdio.h>

??2?#include<math2.h>

??3?int?main(){

??4?????????int?i=11,j=22;

??5?????????printf("__%d__\n",myadd(i,j));

??6?????????return?0;

??7?}

?

math2.h///?????

??1?#ifndef?_MATH2_H_

??2?????????#define?_MATH2_H_

??3?????????int?myadd(int?,int?);

??4?#endif

?

/myadd.c//??????????????????????????????????????

??1?int?myadd(int?i,int?j){

??2?????????return?i+j;

??3?}

???

對于頭文件這里用兩種情況:

情況一:將其放到/usr/include/

情況二:在編譯時通過-I來指定需要用到的頭文件在那個目錄

?

動態庫制作使用:????????????????????????????

現在我要將myadd.c制作成動態庫,使得main.c能夠使用該動態庫

第一步:gcc?-c?myadd.c?-o?myadd.o?-fpic

//用到fpic參數的原因:myadd.o需要來制作庫文件,庫文件不同于一般

的二進制文件,他需要一些特殊的格式和特殊的信息,因此用-fpic來生成這些特

殊格式和信息

?

第二步:gcc?-shared?-WL,-soname,libmath.so.1?-o?libmath-1.0.0.so?

myadd.o

//-shared表示要生成動態庫;-wl,-sonname,libmyadd.so.1將會導致字

符串libmyadd.so.1作為文件名稱被記錄在最終生成的庫文件libmath-1.0.0.so

?

ok至此生成了該動態庫,但是此時還不能使用,需要下面在做一些工作:

有兩種情況使用該動態庫:

?

情況一:將其放到系統庫中

第一步:cp?libmath-1.0.0.so?/lib/

注意此時用到的庫名是math;

?

第二步:但是此時通過gcc?main.c?-lmath還是不能編譯成功,這是因為,編譯器

到系統庫中找到庫,是找libmath.so,而不是直接找libmath-1.0.0.so,因而需要

/lib/下建立libmath-1.0.0.so的軟連接:

ln?-s?/lib/libmath-1.0.0.so?libmath.so

?

第三步:在gcc編譯后的文件還是不能執行,這是因為,我們在制作動態庫的時候

指定了鏈接的庫名是libmath.so.1(但是我們真正的庫是libmath-1.0.0.so),因

而我們還需要創建一個關于libmath-1.0.0.so的軟連接:

ln?-s?/lib/libmath-1.0.0.so?libmath.so.1

上面的工作做完之后就可以完全的將制作的動態庫使用在我們的應用程序,即編

譯和運行都可以通過

?

情況二:可以將頭文件以及生成的庫,還有關于該庫的兩個軟連接放到當前(或

者你指定的目錄下);

第一步:將情況二說的文件生成并一一放到當前目錄下?

第二步:此時編譯需要用到:

gcc?main.c?-L.?-I.?

//對于-L是用于指定在編譯時需要用到庫搜索路徑?//對于-I是用于指定

在編譯時頭文件的存放目錄

第三步:在編譯成功后的文件還是不能直接運行,需要添加一個環境變量在指定

在鏈接庫時的搜索路勁(注意不能寫錯了變量名):

????export?LD_LIBRARY_PATH=/hyg/linux高級編程/文件IO/jingtai

?

完了之后在自己設定的目錄下就可以運行自己生成的動態庫文件。

?

?

靜態庫的制作:

情況一:放到系統庫中

?

第一步:?gcc?-c?myadd.c?-o?myadd.o

第二步:ar?rc?libmyadd.a?myadd.o

//第二步是制作靜態庫

第三步:cp?libmyadd.a?/lib/

第四步:gcc?mian.c?-lmyadd??-I.?-static

?

情況二:可以放到指定目錄,在編譯時需要指定路徑,方法同動態庫的情況二

?

此下面部分轉于:http://www.cnblogs.com/feisky/archive/2010/03/09/1681996.html

動態庫的顯式調用?

??顯式調用動態庫需要四個函數的支持,??函數?dlopen?打開動態庫,??函數?dlsym?獲取動態庫中對象基址,??函數?dlerror?獲取顯式動態庫操作中的錯誤信息,??函數?doclose?關閉動態庫.

[bill@billstone?make_lib]$?cat?main.c?

#include?<dlfcn.h>?

int?main()?

{?

????????????????void?*pHandle;?

????????????????void?(*pFunc)();????????????????????????????????????????????????????//??指向函數的指針?

????????????????int?*p;?

????????????????pHandle?=?dlopen("./d1.so",?RTLD_NOW);??????????????????//??打開動態庫?

????????????????if(!pHandle){?

????????????????????????????????printf("Can't?find?d1.so?\n");?

????????????????????????????????exit(1);?

????????????????}?

????????????????pFunc?=?(void?(*)())dlsym(pHandle,?"print");????????????????//??獲取庫函數?print?的地址?

????????????????if(pFunc)?

????????????????????????????????pFunc();?

????????????????else?

????????????????????????????????printf("Can't?find?function?print\n");?

????????????????p?=?(int?*)dlsym(pHandle,?"p");??????????????????????????????????????//??獲取庫變量?p?的地址?

????????????????if(p)?

????????????????????????????????printf("p?=?%d\n",?*p);?

????????????????else?

????????????????????????????????printf("Can't?find?int?p\n");?

????????????????dlclose(pHandle);????????????????????????????????????????????????????????????????//??關閉動態庫?

????????????????return?0;?

}?

[bill@billstone?make_lib]$?gcc?-o?tds?main.c?–ld1?–L.

此時還不能立即./tds,因為在動態函數庫使用時,會查找/usr/lib、/lib目錄下的動態函數庫,而此時我們生成的庫不在里邊。?這個時候有好幾種方法可以讓他成功運行:?最直接最簡單的方法就是把libstr_out.so拉到/usr/lib或/lib中去。?還有一種方法?export?LD_LIBRARY_PATH=$(pwd)?另外還可以在/etc/ld.so.conf文件里加入我們生成的庫的目錄,然后/sbin/ldconfig。?/etc/ld.so.conf是非常重要的一個目錄,里面存放的是鏈接器和加載器搜索共享庫時要檢查的目錄,默認是從/usr/lib?/lib中讀取的,所以想要順利運行,我們也可以把我們庫的目錄加入到這個文件中并執行/sbin/ldconfig?。另外還有個文件需要了解/etc/ld.so.cache,里面保存了常用的動態函數庫,且會先把他們加載到內存中,因為內存的訪問速度遠遠大于硬盤的訪問速度,這樣可以提高軟件加載動態函數庫的速度了。

庫依賴的查看

使用ldd命令來查看執行文件依賴于哪些庫。

該命令用于判斷某個可執行的?binary?檔案含有什么動態函式庫。
[root@test?root]#?ldd?[-vdr]?[filename]
參數說明:
--version 打印ldd的版本號
-v?--verbose 打印所有信息,例如包括符號的版本信息
-d?--data-relocs 執行符號重部署,并報告缺少的目標對象(只對ELF格式適用)
-r?--function-relocs 對目標對象和函數執行重新部署,并報告缺少的目標對象和函數(只對ELF格式適用)
--help?用法信息。

如果命令行中給定的庫名字包含'/',這個程序的libc5版本將使用它作為庫名字;否則它將在標準位置搜索庫。運行一個當前目錄下的共享庫,加前綴"./"。

?

?

轉載于:https://www.cnblogs.com/jiangu66/p/3202848.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的静态库和动态库详解(部分参考别人)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久婷婷av | jizzjizz黄大片 | 麻豆视频91 | 中文字幕高清一区 | 日韩免费一区二区 | 邻家有女4完整版电影观看 欧美偷拍另类 | 少妇高潮一区二区三区99刮毛 | 久久一线 | 草草福利影院 | 男女午夜啪啪 | 亚洲毛片久久 | 国产www在线观看 | sese国产 | 日韩精品v| 亚洲视频中文字幕 | 午夜不卡久久精品无码免费 | 国产又黄又猛 | 粉嫩av一区二区三区四区五区 | 喷潮在线观看 | 男女在线观看 | 岳奶大又白下面又肥又黑水多 | 在线看一区 | 欧美日韩中文字幕一区二区三区 | 日韩欧美精品国产 | 亚洲三级在线看 | 欧美男女性生活视频 | 国产精品国产成人国产三级 | 中文字幕第页 | 91久久精品一区二区三 | 性史性农村dvd毛片 日韩精品在线视频观看 | 欧美亚洲另类图片 | 亚洲精品一区二区三区四区 | 毛片在线免费播放 | 国产精品久久久久毛片 | 激情亚洲天堂 | 神马午夜我不卡 | 欧美色炮| 国产又粗又猛又色 | 日韩日韩日韩日韩日韩 | 色吧婷婷| 欧美成人一区二区三区高清 | 成人在线播放视频 | 婷婷色在线播放 | 亚洲一本二本 | 国产精品久久久久久久久免费桃花 | 香蕉视频在线观看免费 | 午夜精品久久久久 | 直接看的毛片 | 日韩无码专区 | 国产亚洲欧美精品久久久www | 亚洲av成人精品一区二区三区 | www.久草.com | 国产精品视频免费网站 | 亚洲天堂h | 免费在线观看的黄色网址 | 亚洲一二三四在线观看 | 粉嫩av网 | 国产人妻互换一区二区 | 成人午夜淫片100集 伊人久久国产 | 国产白丝精品91爽爽久久 | 9l视频自拍九色9l视频 | 森泽佳奈作品在线观看 | 国产99久久久 | 久久一区| 在线观看一区 | 女人洗澡一级特黄毛片 | 岛国av不卡| 野外做受又硬又粗又大视频√ | 久久亚洲免费视频 | 日韩国产欧美精品 | 91亚洲国产精品 | 萌白酱喷水视频 | 另类小说久久 | 麻豆亚洲av熟女国产一区二 | 新天堂网| 国产chinasex麻豆videos | 中日韩精品一区二区三区 | 中文字幕一区二区三区四区欧美 | 亚洲做受高潮无遮挡 | 亚洲午夜无码av毛片久久 | 九九爱爱视频 | 麻豆剧场 | 久久免费看视频 | 无码人妻一区二区三区在线视频 | 国产在线观看一区 | 黄色一区二区三区四区 | 精品国产a线一区二区三区东京热 | 国产精品男女视频 | 亚洲无卡 | 男女瑟瑟网站 | 日韩av线观看 | 日韩精品电影一区二区三区 | 激情小说中文字幕 | 黄色三级片毛片 | 国产在线xxx| 高h视频在线播放 | 亚洲av综合一区二区 | 亚洲欧美日韩在线一区二区 | 成人免费黄色大片v266 |