❶ 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澶у皬锛岃繍琛岀殑阃熷害绛夌患钖堣冭槛銆