


Linux中如何創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
函數(shù)庫(kù)分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。
靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù)。
動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在。
程序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;
}
無(wú)論動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)都需要用到.o文件來(lái)生成,先編譯生成.o文件。
# gcc -c hello.c
1:創(chuàng)建靜態(tài)庫(kù)
靜態(tài)庫(kù)文件名的命名規(guī)范是以lib為前綴,緊接著跟靜態(tài)庫(kù)名,擴(kuò)展名為.a。例如:我們將創(chuàng)建的靜態(tài)庫(kù)名為myhello,則靜態(tài)庫(kù)文件名就是libmyhello.a。
# ar cr libmyhello.a hello.o
使用靜態(tài)庫(kù):只需要在你的源程序中加入包含你所需要使用到的函數(shù)的聲明(即包含頭文件),然后在gcc生成目標(biāo)文件時(shí)候指明靜態(tài)庫(kù)就OK了(除非你包含的頭文件在/usr/include,庫(kù)文件在標(biāo)準(zhǔn)庫(kù)/usr/lib,/lib下,否則你得顯示指明他們的路徑)
# gcc -o hello main.c -L. -lmyhello
# ./hello
Hello everyone!
刪除靜態(tài)庫(kù)文件運(yùn)行./hello,程序正常運(yùn)行,說(shuō)明靜態(tài)庫(kù)公用函數(shù)已經(jīng)鏈接到目標(biāo)文件。
2: 利用.o文件創(chuàng)建動(dòng)態(tài)庫(kù)
動(dòng)態(tài)庫(kù)文件擴(kuò)展名為.so。
# gcc -shared -fPCI -o libmyhello.so hello.o
動(dòng)態(tài)庫(kù)的使用與靜態(tài)庫(kù)使用方式一樣
# 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
哦!出錯(cuò)了。快看看錯(cuò)誤提示,原來(lái)是找不到動(dòng)態(tài)庫(kù)文件libmyhello.so。程序在運(yùn)行時(shí),會(huì)在/usr/lib和/lib等目錄中查找需要的動(dòng)態(tài)庫(kù)文件。若找到,則載入動(dòng)態(tài)庫(kù),否則將提示類(lèi)似上述錯(cuò)誤而終止程序運(yùn)行。
如何找到生成的動(dòng)態(tài)庫(kù)有3種方式:
1)把庫(kù)拷貝到/usr/lib和/lib目錄下。
(2)在LD_LIBRARY_PATH環(huán)境變量中加上庫(kù)所在路徑。
例如動(dòng)態(tài)庫(kù)libhello.so在/home/example/lib目錄下:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib
(3) 修改/etc/ld.so.conf文件,把庫(kù)所在的路徑加到文件末尾,并執(zhí)行l(wèi)dconfig刷新。這樣,加入的目錄下的所有庫(kù)文件都可見(jiàn)。
當(dāng)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)同名時(shí), gcc命令將優(yōu)先使用動(dòng)態(tài)庫(kù)。
函數(shù)庫(kù)分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。
靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù)。
動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入,因此在程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在。
程序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;
}
無(wú)論動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)都需要用到.o文件來(lái)生成,先編譯生成.o文件。
# gcc -c hello.c
1:創(chuàng)建靜態(tài)庫(kù)
靜態(tài)庫(kù)文件名的命名規(guī)范是以lib為前綴,緊接著跟靜態(tài)庫(kù)名,擴(kuò)展名為.a。例如:我們將創(chuàng)建的靜態(tài)庫(kù)名為myhello,則靜態(tài)庫(kù)文件名就是libmyhello.a。
# ar cr libmyhello.a hello.o
使用靜態(tài)庫(kù):只需要在你的源程序中加入包含你所需要使用到的函數(shù)的聲明(即包含頭文件),然后在gcc生成目標(biāo)文件時(shí)候指明靜態(tài)庫(kù)就OK了(除非你包含的頭文件在/usr/include,庫(kù)文件在標(biāo)準(zhǔn)庫(kù)/usr/lib,/lib下,否則你得顯示指明他們的路徑)
# gcc -o hello main.c -L. -lmyhello
# ./hello
Hello everyone!
刪除靜態(tài)庫(kù)文件運(yùn)行./hello,程序正常運(yùn)行,說(shuō)明靜態(tài)庫(kù)公用函數(shù)已經(jīng)鏈接到目標(biāo)文件。
2: 利用.o文件創(chuàng)建動(dòng)態(tài)庫(kù)
動(dòng)態(tài)庫(kù)文件擴(kuò)展名為.so。
# gcc -shared -fPCI -o libmyhello.so hello.o
動(dòng)態(tài)庫(kù)的使用與靜態(tài)庫(kù)使用方式一樣
# 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
哦!出錯(cuò)了。快看看錯(cuò)誤提示,原來(lái)是找不到動(dòng)態(tài)庫(kù)文件libmyhello.so。程序在運(yùn)行時(shí),會(huì)在/usr/lib和/lib等目錄中查找需要的動(dòng)態(tài)庫(kù)文件。若找到,則載入動(dòng)態(tài)庫(kù),否則將提示類(lèi)似上述錯(cuò)誤而終止程序運(yùn)行。
如何找到生成的動(dòng)態(tài)庫(kù)有3種方式:
1)把庫(kù)拷貝到/usr/lib和/lib目錄下。
(2)在LD_LIBRARY_PATH環(huán)境變量中加上庫(kù)所在路徑。
例如動(dòng)態(tài)庫(kù)libhello.so在/home/example/lib目錄下:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib
(3) 修改/etc/ld.so.conf文件,把庫(kù)所在的路徑加到文件末尾,并執(zhí)行l(wèi)dconfig刷新。這樣,加入的目錄下的所有庫(kù)文件都可見(jiàn)。
當(dāng)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)同名時(shí), gcc命令將優(yōu)先使用動(dòng)態(tài)庫(kù)。
關(guān)鍵字:靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)、gcc
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶(hù)
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶(hù)的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解