日韩性视频-久久久蜜桃-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年技術見證,附贈技術全景圖

總結

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

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

主站蜘蛛池模板: 国产在线视频自拍 | 熟女少妇a性色生活片毛片 亚洲伊人成人网 | 久草观看视频 | 欧美性猛交xxxx乱大交俱乐部 | 午夜福利视频一区二区 | 在线黄色网 | 免费播放毛片精品视频 | 尤物视频在线 | 中文字幕乱码人妻无码久久95 | 午夜影院在线免费观看 | 欧亚av| 国产热视频 | 亚洲乱码国产乱码精品精98午夜 | 欧美日韩一级大片 | 亚洲精品66 | 午夜极品视频 | 亚洲一区二区三区四区在线播放 | 午夜精品福利视频 | 日本少妇激情视频 | 假日游船 | 人妻无码久久一区二区三区免费 | 折磨小男生性器羞耻的故事 | 超碰免费97 | 亚洲高清视频在线观看 | 国产一级一级 | 亚洲国产精品视频在线观看 | 天天综合人人 | 日韩高清在线观看 | 好男人影视www| 日本久久中文字幕 | 国内精品视频在线 | 在线一区观看 | 狠狠干综合网 | 欧美日本韩国一区 | 黄频在线播放 | 潘金莲裸体一级淫片视频 | 娇妻之欲海泛舟无弹窗笔趣阁 | 国产69精品麻豆 | av影院在线播放 | 91成人免费在线 | 日韩成人在线观看视频 | 神马午夜影院 | 欧美又大粗又爽又黄大片视频 | 亚洲一区二区三区四区在线播放 | 91红桃视频| 免费一级一片 | 亚洲精品鲁一鲁一区二区三区 | 成人免费区一区二区三区 | 久久久久久久中文字幕 | 久久看看 | 99reav| 国产精品一线 | 麻豆免费电影 | 亚洲成年人网 | 国产成人精品无码免费看夜聊软件 | 国产欧美精品aaaaaa片 | 精品无码一级毛片免费 | 91网站免费观看 | 波多野结衣一区二区在线 | 在线a毛片| 72pao成人国产永久免费视频 | 成年人性生活免费视频 | 亚洲黄色激情 | 成人va视频 | 三级影片在线免费观看 | 精品在线免费观看 | 久久精精品久久久久噜噜 | 激情综合一区二区三区 | 国产成年妇视频 | 日韩精品免费一区二区在线观看 | www.国产欧美 | 午夜av影院 | 日本一区二区高清免费 | 午夜网站在线观看 | 叼嘿视频91 | 久久综合久久综合久久综合 | 丝袜诱惑一区 | 成人欧美一区二区三区黑人孕妇 | 光溜溜视频素材大全美女 | 国产一区二区三区视频在线观看 | 久久精品国产成人av | 久久久wwww| 国产精品视频在线看 | 国产日本在线观看 | 久久亚洲少妇 | 国产一区二区精品丝袜 | 丰满人妻一区二区三区在线 | 欧美精品在欧美一区二区 | 国产精品免费久久久久 | 日韩一级免费观看 | 99国产一区| 瑟瑟综合网 | 自拍偷拍视频网 | 超碰在线观看91 | 国产亚洲av片在线观看18女人 | 久久久久久免费视频 | 美日韩免费 | 色综合av| 影音先锋亚洲精品 |