Linux下的靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù) - yg2362 - C++博客
1. 制作自己的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
linux 下動(dòng)態(tài)庫(kù)以 .so 結(jié)尾,靜態(tài)庫(kù)以 .a 結(jié)尾,它們都以 lib 開頭,比如一個(gè)庫(kù)名為 net, 那么它的全名應(yīng)該是 libnet.so 或者 libnet.a 。
我們有兩個(gè)文件, hello.c 和 test.c ,下面是兩個(gè)文件的內(nèi)容
//hello.c
#include <stdio.h>
?
void my_lib_func()
{
printf("Library routine called\r\n");
}
?
//test.c
#include <stdio.h>
?
int main()
{
my_lib_func();
?
return 1;
}
?
test.c 調(diào)用了 hello.c 的方法,我們把 hello.c 封裝成庫(kù)文件。無(wú)論是靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù),都是由 .o 文件組成,我們先把 gcc -c hello.c 生成 .o 文件
制作靜態(tài)庫(kù)
ar crv libmyhello.a hello.o, ar 是生成靜態(tài)庫(kù)的命令,libmyhello.a是我的靜態(tài)庫(kù)名。下一步就是在我的程序中使用靜態(tài)庫(kù)
?
?
可以看到已經(jīng)有了Library routine called的結(jié)果,說(shuō)明調(diào)用成功了。
下面我們刪除 libmyhello.a, 看看程序是否還是運(yùn)行正常
我們發(fā)現(xiàn)程序依然運(yùn)行正常,說(shuō)明靜態(tài)庫(kù)已經(jīng)連接進(jìn)入我們的程序中
制作動(dòng)態(tài)庫(kù)
我們看見動(dòng)態(tài)庫(kù) libmyhello.so 已經(jīng)生成,下面繼續(xù)使用
找不到庫(kù)文件,這個(gè)時(shí)候我們把 so 文件拷貝到 /usr/lib 下面
運(yùn)行成功
?
2. 動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)同時(shí)存在的調(diào)用規(guī)則
我們可以發(fā)現(xiàn),不論是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù),程序編譯連接的時(shí)候都是加的參數(shù) -l ,那么當(dāng)他們同時(shí)存在的時(shí)候,程序會(huì)選擇動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)呢。我們做個(gè)嘗試。
我們同時(shí)存在 libmyhello.a 和 libmyhello.so ,我們發(fā)現(xiàn)運(yùn)行的時(shí)候,出現(xiàn)找不到動(dòng)態(tài)庫(kù)的錯(cuò)誤,由此,我們可以得出結(jié)論,同時(shí)存在動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的時(shí)候, gcc 會(huì)優(yōu)先選擇動(dòng)態(tài)庫(kù)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
