❶ Ubuntu靜態庫怎麼使用
-供參考
linux 靜態庫的生成與使用
1、windows系統包括靜態鏈接庫(*.lib文件)和動態鏈接庫(*.dll文件)。
2、linux通常把庫文件存放在/usr/lib或/lib目錄下。
linux庫文件名:前綴lib、庫名和後綴3部分組成,其中動態鏈接庫以.so作為後綴,靜態鏈接庫通常以.a作為後綴。
區別:
靜態鏈接庫的代碼在編譯時就拷貝到應用程序中,這樣的優點是節省編譯時間動態庫是程序在開始運行後調用庫函數時才被載入。
靜態庫的創建和使用
1、在一個頭文件中聲明靜態庫所導出的函數。
2、在一個源文件中實現靜態庫所導出的函數。
3、編譯源文件,生成可執行代碼(.o文件)
4、將可執行代碼所在的目標文件加入到某個靜態庫中,並將靜態庫拷貝到系統默認的存放文件的目錄下。
例如:mylib.h聲明函數, mylib.c實現函數
1、編譯mylib.c生成目標文件:gcc -o mylib.o -c mylib.c
2、將目標文件加入到靜態庫中:ar rcs libmylib.a mylib.o
3、將靜態庫到linux的庫目錄 (/usr/lib 或者 /lib)下:
cp libmylib.a /usr/lib/libmylib.a
4、在調用庫函數的文件中添加#include "mylib.h"這樣就可調用靜態庫中函數
5、使用靜態庫編譯:gcc -o main main.c -l mylib
注意:編譯時無需帶上前綴和後綴。這就是為什麼在使用libxml2時librareis(-l)設置為:xml2
-梁兆鈴
❷ linux怎樣實現c語言動態庫與靜態庫的鏈接
Linux系統中靜態庫是.a文件,編譯鏈接.a文件只需要加上.a文件的完整的文件路徑就可以了,比如:
gcc -o hello hello.c /usr/lib/libm.a
Linux系統的動態庫是系統中的.so文件,編譯鏈接動態庫需要用-L參數指定動態庫的搜索路徑,還要用-l(這個是小寫的L)指定動態庫的名字,比如:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
❸ 靜態庫和動態庫的區別以及使用
我們通常把一些公用函數製作成函數庫,供其它程序使用。
函數庫分為靜態庫和動態庫兩種。
靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。
本文主要通過舉例來說明在Linux中如何創建靜態庫和動態庫,以及使用它們。
在創建函數庫前,我們先來准備舉例用的源程序,並將函數庫的源程序編譯成.o文件。
第1步:編輯得到舉例的程序--hello.h、hello.c和main.c;
hello.h(見程序1)為該函數庫的頭文件。
hello.c(見程序2)是函數庫的源程序,其中包含公用函數hello,該函數將在屏幕上輸出"Hello XXX!"。
main.c(見程序3)為測試庫文件的主程序,在主程序中調用了公用函數hello。
程序1: hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
程序2: hello.c
#include
void hello(const char *name)
{
printf("Hello %s!/n", name);
}
程序3: main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
第2步:將hello.c編譯成.o文件;
無論靜態庫,還是動態庫,都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。
在系統提示符下鍵入以下命令得到hello.o文件。
# gcc -c hello.c
#
(注1:本文不介紹各命令使用和其參數功能,若希望詳細了解它們,請參考其他文檔。)
(注2:首字元"#"是系統提示符,不需要鍵入,下文相同。)
我們運行ls命令看看是否生存了hello.o文件。
# ls
hello.c hello.h hello.o main.c
#
(注3:首字元不是"#"為系統運行結果,下文相同。)
在ls命令結果中,我們看到了hello.o文件,本步操作完成。
下面我們先來看看如何創建靜態庫,以及使用它。
第3步:由.o文件創建靜態庫;
靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。在創建和使用靜態庫時,需要注意這點。創建靜態庫用ar命令。
在系統提示符下鍵入以下命令將創建靜態庫文件libmyhello.a。
# ar cr libmyhello.a hello.o
#
我們同樣運行ls命令查看結果:
# ls
hello.c hello.h hello.o libmyhello.a main.c
#
ls命令結果中有libmyhello.a。
第4步:在程序中使用靜態庫;
靜態庫製作完了,如何使用它內部的函數呢?只需要在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然後在用gcc命令生成目標文件時指明靜態庫名,gcc將會從靜態庫中將公用函數連接到目標文件中。注意,gcc會在靜態庫名前加上前綴lib,然後追加擴展名.a得到的靜態庫文件名來查找靜態庫文件。
在程序3:main.c中,我們包含了靜態庫的頭文件hello.h,然後在主程序main中直接調用公用函數hello。下面先生成目標程序hello,然後運行hello程序看看結果如何。
# gcc -o hello main.c -L. -lmyhello
# ./hello
Hello everyone!
#
我們刪除靜態庫文件試試公用函數hello是否真的連接到目標文件 hello中了。
# rm libmyhello.a
rm: remove regular file `libmyhello.a'? y
# ./hello
Hello everyone!
#
程序照常運行,靜態庫中的公用函數已經連接到目標文件中了。
我們繼續看看如何在Linux中創建動態庫。我們還是從.o文件開始。
第5步:由.o文件創建動態庫文件;
動態庫文件名命名規范和靜態庫文件名命名規范類似,也是在動態庫名增加前綴lib,但其文件擴展名為.so。例如:我們將創建的動態庫名為myhello,則動態庫文件名就是libmyhello.so。用gcc來創建動態庫。
在系統提示符下鍵入以下命令得到動態庫文件libmyhello.so。
# gcc -shared -fPCI -o libmyhello.so hello.o
#
我們照樣使用ls命令看看動態庫文件是否生成。
# ls
hello.c hello.h hello.o libmyhello.so main.c
#
第6步:在程序中使用動態庫;
在程序中使用動態庫和使用靜態庫完全一樣,也是在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然後在用gcc命令生成目標文件時指明動態庫名進行編譯。我們先運行gcc命令生成目標文件,再運行它看看結果。
# gcc -o hello main.c -L. -lmyhello
# ./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
#
哦!出錯了。快看看錯誤提示,原來是找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。我們將文件 libmyhello.so復制到目錄/usr/lib中,再試試。
# mv libmyhello.so /usr/lib
# ./hello
Hello everyone!
#
成功了。這也進一步說明了動態庫在程序運行時是需要的。
我們回過頭看看,發現使用靜態庫和使用動態庫編譯成目標程序使用的gcc命令完全一樣,那當靜態庫和動態庫同名時,gcc命令會使用哪個庫文件呢?抱著對問題必究到底的心情,來試試看。
先刪除 除.c和.h外的 所有文件,恢復成我們剛剛編輯完舉常式序狀態。
# rm -f hello hello.o /usr/lib/libmyhello.so
# ls
hello.c hello.h main.c
#
在來創建靜態庫文件libmyhello.a和動態庫文件libmyhello.so。
# gcc -c hello.c
# ar cr libmyhello.a hello.o
# gcc -shared -fPCI -o libmyhello.so hello.o
# ls
hello.c hello.h hello.o libmyhello.a libmyhello.so main.c
#
通過上述最後一條ls命令,可以發現靜態庫文件libmyhello.a和動態庫文件libmyhello.so都已經生成,並都在當前目錄中。然後,我們運行gcc命令來使用函數庫myhello生成目標文件hello,並運行程序 hello。
# gcc -o hello main.c -L. -lmyhello
# ./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
#
從程序hello運行的結果中很容易知道,當靜態庫和動態庫同名時, gcc命令將優先使用動態庫。
❹ Linux下的靜態庫和動態庫
靜態庫
可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。
靜態庫優缺點
上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。
優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。
缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。
動態庫
在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so
動態庫優缺點
優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。
缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。
❺ c鍔ㄦ佸簱鍑芥暟c鍔ㄦ佸簱linux
linux涓婥/C++鍔ㄦ佸簱鍦ㄨ繍琛屾椂鏄鎬庢牱鍔犺澆榪涙潵鐨勶紵
浣犺寸殑紼嬪簭搴旇ユ槸閲囩敤浜哾ynamicloading
瀹為檯涓婅皟鐢ㄤ簡榪欐牱涓緇勬帴鍙o細
dlopendlclosedlsym鍑芥暟鍚嶈浣滀負鍙傛暟浼犻掕繘鍘伙紝浜ょ粰鍔ㄦ侀摼鎺ュ櫒ld.so銆傞殢鍚巐d.so浼氬湪宸茬粡鍔犺澆鐨勫姩鎬佸簱涓鏌ユ壘涓庡嚱鏁板悕鍖歸厤鐨勭﹀彿銆傚傛灉鏌ユ壘鎴愬姛灝卞彲浠ヨ繑鍥炰竴涓鍦板潃鎸囧悜榪欎釜絎﹀彿鐨勫湴鍧銆傚逛簬鍑芥暟錛岃繖涓鍦板潃灝辯浉褰撲簬鏄涓涓鍑芥暟鎸囬拡銆傝岃繖鏁翠釜榪囩▼鍙浠ラ『鍒╄繘琛屼笅鍘伙紝榪樿佷緷璧栦簬褰撳墠紼嬪簭涓庡姩鎬佸簱鐨凙BI
linuxc緙栫▼璋冪敤緋葷粺鐨勫姩鎬佸簱鏃訛紝瑕佷嬌鐢╠lopen絳夊嚱鏁板悧錛
linux璋冪敤搴撶殑鏂瑰紡鏈変笁縐:
1.闈欐侀摼鎺ュ簱
2.鍔ㄦ侀摼鎺ュ簱
3.鍔ㄦ佸姞杞藉簱
鍏朵腑1,2閮芥槸鍦ㄧ紪紼嬫椂鐩存帴璋冪敤,鍦ㄩ摼鎺ユ椂鍔犲弬鏁-l榪涜岄摼鎺
絎涓夌嶉渶瑕佸湪緙栫▼鏃朵嬌鐢╠lopen絳夊嚱鏁版潵鑾峰彇搴撻噷闈㈠嚱鏁扮殑瀹氫箟,鐒跺悗榪涜岃皟鐢.
涓嶈繃瀵逛簬娌℃湁鎻愪緵澶存枃浠剁殑鍔ㄦ佸簱,鍙鑳絛lopen絳夊嚱鏁版潵璋冪敤
linuxwindows闈欐佸簱鍜屽姩鎬佸簱鐨勫尯鍒錛
涓よ呭尯鍒錛
a錛岄潤鎬佸簱鐨勪嬌鐢ㄩ渶瑕侊細
1鍖呭惈涓涓瀵瑰簲鐨勫ご鏂囦歡鍛婄煡緙栬瘧鍣╨ib鏂囦歡閲岄潰鐨勫叿浣撳唴瀹
2璁劇疆lib鏂囦歡鍏佽哥紪璇戝櫒鍘繪煡鎵懼凡緇忕紪璇戝ソ鐨勪簩榪涘埗浠g爜
b錛屽姩鎬佸簱鐨勪嬌鐢錛
紼嬪簭榪愯屾椂闇瑕佸姞杞藉姩鎬佸簱錛屽瑰姩鎬佸簱鏈変緷璧栨э紝闇瑕佹墜鍔ㄥ姞鍏ュ姩鎬佸簱
c錛屼緷璧栨э細
闈欐侀摼鎺ヨ〃紺洪潤鎬佹э紝鍦ㄧ紪璇戦摼鎺ヤ箣鍚庯紝lib搴撲腑闇瑕佺殑璧勬簮宸茬粡鍦ㄥ彲鎵ц岀▼搴忎腑浜嗭紝涔熷氨鏄闈欐佸瓨鍦錛屾病鏈変緷璧栨т簡
鍔ㄦ侊紝灝辨槸瀹炴椂鎬э紝鍦ㄨ繍琛岀殑鏃跺欒澆鍏ラ渶瑕佺殑璧勬簮錛岄偅涔堝繀欏誨湪榪愯岀殑鏃跺欐彁渚涢渶瑕佺殑鍔ㄦ佸簱錛屾湁渚濊禆鎬э紝榪愯屾椂鍊欐病鏈夋壘鍒板簱灝變笉鑳借繍琛屼簡
d錛屽尯鍒錛
綆鍗曡詫紝闈欐佸簱灝辨槸鐩存帴灝嗛渶瑕佺殑浠g爜榪炴帴榪涘彲鎵ц岀▼搴忥紱鍔ㄦ佸簱灝辨槸鍦ㄩ渶瑕佽皟鐢ㄥ叾涓鐨勫嚱鏁版椂錛屾牴鎹鍑芥暟鏄犲皠琛ㄦ壘鍒拌ュ嚱鏁扮劧鍚庤皟鍏ュ爢鏍堟墽琛屻
鍋氭垚闈欐佸簱鍙鎵ц屾枃浠舵湰韜姣旇緝澶э紝浣嗕笉蹇呴檮甯﹀姩鎬佸簱
鍋氭垚鍔ㄦ佸簱鍙鎵ц屾枃浠舵湰韜姣旇緝灝忥紝浣嗛渶瑕侀檮甯﹀姩鎬佸簱
閾炬帴闈欐佸簱錛岀紪璇戠殑鍙鎵ц屾枃浠舵瘮杈冨ぇ錛屽綋鐒跺彲浠ョ敤strip鍛戒護綺劇畝涓涓嬶紙濡傦細striplibtest.a錛夛紝浣嗚繕鏄瑕佹瘮閾炬帴鍔ㄦ佸簱鐨勫彲鎵ц屾枃浠跺ぇ銆傜▼搴忚繍琛屾椂闂撮熷害紼嶅井蹇涓鐐廣
闈欐佸簱鏄紼嬪簭榪愯岀殑鏃跺欏凡緇忚皟鍏ュ唴瀛橈紝涓嶇℃湁娌℃湁璋冪敤錛岄兘浼氬湪鍐呭瓨閲屽ご銆傞潤鎬佸簱鍦ㄧ▼搴忕紪璇戞椂浼氳榪炴帴鍒扮洰鏍囦唬鐮佷腑錛岀▼搴忚繍琛屾椂灝嗕笉鍐嶉渶瑕佽ラ潤鎬佸簱銆
鍏跺湪緙栬瘧紼嬪簭鏃惰嫢閾炬帴,紼嬪簭榪愯屾椂浼氬湪緋葷粺鎸囧畾鐨勮礬寰勪笅鎼滅儲錛岀劧鍚庡煎叆鍐呭瓨錛岀▼搴忎竴鑸鎵ц屾椂闂寸◢寰闀誇竴鐐癸紝浣嗙紪璇戠殑鍙鎵ц屾枃浠舵瘮杈冨皬錛涘姩鎬佸簱鏄紼嬪簭榪愯岀殑鏃跺欓渶瑕佽皟鐢ㄧ殑鏃跺欐墠瑁呭叆鍐呭瓨錛屼笉闇瑕佺殑鏃跺欐槸涓嶄細瑁呭叆鍐呭瓨鐨勩
鍔ㄦ佸簱鍦ㄧ▼搴忕紪璇戞椂騫朵笉浼氳榪炴帴鍒扮洰鏍囦唬鐮佷腑錛岃屾槸鍦ㄧ▼搴忚繍琛屾槸鎵嶈杞藉叆錛屽洜姝ゅ湪紼嬪簭榪愯屾椂榪橀渶瑕佸姩鎬佸簱瀛樺湪銆
鍔ㄦ侀摼鎺ュ簱鐨勭壒鐐逛笌浼樺娍
棣栧厛璁╂垜浠鏉ョ湅涓涓嬶紝鎶婂簱鍑芥暟鎺ㄨ繜鍒扮▼搴忚繍琛屾椂鏈熻澆鍏ョ殑濂藉勶細
1.鍙浠ュ疄鐜拌繘紼嬩箣闂寸殑璧勬簮鍏變韓銆
浠涔堟傚康鍛錛熷氨鏄璇達紝鏌愪釜紼嬪簭鐨勫湪榪愯屼腑瑕佽皟鐢ㄦ煇涓鍔ㄦ侀摼鎺ュ簱鍑芥暟鐨勬椂鍊欙紝鎿嶄綔緋葷粺棣栧厛浼氭煡鐪嬫墍鏈夋e湪榪愯岀殑紼嬪簭錛岀湅鍦ㄥ唴瀛橀噷鏄鍚﹀凡鏈夋ゅ簱鍑芥暟鐨勬嫹璐濅簡銆傚傛灉鏈夛紝鍒欒╁叾鍏變韓閭d竴涓鎷瘋礉錛涘彧鏈夋病鏈夋墠閾炬帴杞藉叆銆傝繖鏍風殑妯″紡鉶界劧浼氬甫鏉ヤ竴浜涒滃姩鎬侀摼鎺モ濋濆栫殑寮閿錛屽嵈澶уぇ鐨勮妭鐪佷簡緋葷粺鐨勫唴瀛樿祫婧愩俢鐨勬爣鍑嗗簱灝辨槸鍔ㄦ侀摼鎺ュ簱錛屼篃灝辨槸璇寸郴緇熶腑鎵鏈夎繍琛岀殑紼嬪簭鍏變韓鐫鍚屼竴涓猚鏍囧噯搴撶殑浠g爜孌點
2.灝嗕竴浜涚▼搴忓崌綰у彉寰楃畝鍗曘傜敤鎴峰彧闇瑕佸崌綰у姩鎬侀摼鎺ュ簱錛岃屾棤闇閲嶆柊緙栬瘧閾炬帴鍏朵粬鍘熸湁鐨勪唬鐮佸氨鍙浠ュ畬鎴愭暣涓紼嬪簭鐨勫崌綰с倃indows灝辨槸涓涓寰堝ソ鐨勪緥瀛愩
3.鐢氳嚦鍙浠ョ湡姝e潗鍒伴摼鎺ヨ澆鍏ュ畬鍏ㄧ敱紼嬪簭鍛樺湪紼嬪簭浠g爜涓鎺у埗銆
紼嬪簭鍛樺湪緙栧啓紼嬪簭鐨勬椂鍊欙紝鍙浠ユ槑紜鐨勬寚鏄庝粈涔堟椂鍊欐垨鑰呬粈涔堟儏鍐典笅錛岄摼鎺ヨ澆鍏ュ摢涓鍔ㄦ侀摼鎺ュ簱鍑芥暟銆備綘鍙浠ユ湁涓涓鐩稿綋澶х殑杞浠訛紝浣嗘瘡嬈¤繍琛岀殑鏃跺欙紝鐢變簬涓嶅悓鐨勬搷浣滈渶奼傦紝鍙鏈変竴灝忛儴鍒嗙▼搴忚杞藉叆鍐呭瓨銆傛墍鏈夌殑鍑芥暟鏈鐫鈥滄湁闇奼傛墠璋冨叆鈥濈殑鍘熷垯錛屼簬鏄澶уぇ鑺傜渷浜嗙郴緇熻祫婧愩傛瘮濡傜幇鍦ㄧ殑杞浠墮氬父閮借兘鎵撳紑鑻ュ共縐嶄笉鍚岀被鍨嬬殑鏂囦歡錛岃繖浜涜誨啓鎿嶄綔閫氬父閮界敤鍔ㄦ侀摼鎺ュ簱鏉ュ疄鐜般傚湪涓嬈¤繍琛屽綋涓錛屼竴鑸鍙鏈変竴縐嶇被鍨嬬殑鏂囦歡灝嗕細琚鎵撳紑銆傛墍浠ョ洿鍒扮▼搴忕煡閬撴枃浠剁殑綾誨瀷浠ュ悗鍐嶈澆鍏ョ浉搴旂殑璇誨啓鍑芥暟錛岃屼笉鏄涓寮濮嬪氨灝嗘墍鏈夌殑璇誨啓鍑芥暟閮借澆鍏ワ紝鐒跺悗鎵嶅彂瑙夊湪鏁翠釜紼嬪簭涓鏍規湰娌℃湁鐢ㄥ埌瀹冧滑銆
闈欐佸簱錛氬湪緙栬瘧鐨勬椂鍊欏姞杞界敓鎴愮洰鏍囨枃浠訛紝鍦ㄨ繍琛屾椂涓嶇敤鍔犺澆搴擄紝鍦ㄨ繍琛屾椂瀵瑰簱娌℃湁渚濊禆鎬с
鍔ㄦ佸簱錛氬湪鐩鏍囨枃浠惰繍琛屾椂鍔犺澆錛屾墜鍔ㄥ姞杞斤紝涓斿瑰簱鏈変緷璧栨с
鍏蜂綋鍦ㄥ紑鍙戜腑鐢ㄥ埌鍝縐嶅簱錛屾垜瑙夊緱榪樻槸鏍規嵁瀹為檯鐨勫唴瀛樺ぇ灝忥紝rom澶у皬錛岃繍琛岀殑閫熷害絳夌患鍚堣冭檻銆