linux編譯動態(tài)庫命令 linux編譯動態(tài)庫連接

linux一個(gè)應(yīng)用多個(gè)版本動態(tài)庫命令

Linux 系統(tǒng),也同樣面臨和Window一樣的問題,如何控制動態(tài)庫的多個(gè)版本問題。Window之前沒有處理好,為此專門有個(gè)名詞來形容這個(gè)問題 “Dll hell”,其嚴(yán)重影響軟件的升級和維護(hù)。 Dll hell 是指windows 上動態(tài)庫新版本覆蓋舊版本,但是卻不兼容老版本。常常發(fā)生在程序升級之后,動態(tài)庫更新,原有程序運(yùn)行不起來;或者裝新軟件,但是已有的軟件運(yùn)行不起來。 同樣Linux操作系統(tǒng),也有同樣的問題,那么它是怎么解決的呢?

創(chuàng)新互聯(lián)2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元北安做網(wǎng)站,已為上家服務(wù),為北安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

Linux 為解決這個(gè)問題,引入了一套機(jī)制,如果遵守這個(gè)機(jī)制來做,就可以避免這個(gè)問題。 但是這只事一個(gè)約定,不是強(qiáng)制的。但是建議遵守這個(gè)約定,否則同樣也會出現(xiàn) Linux 版的Dll hell 問題。 下面來介紹一個(gè)這個(gè)機(jī)制。 這個(gè)機(jī)制是通過文件名,來控制dll (shared library) 的版本。

Linux 上的Dll ,叫shared library,其有三個(gè)名字,分別有不同的目的。

第一個(gè)是共享庫本身的文件名(real name),其通常包含版本號,常常是是這樣: libmath.so.1.1.1234 。 lib是Linux 上的庫的約定前綴,math 是共享庫名字,so 是共享庫的后綴名,1.1.1234的是共享庫的版本號,其主版本號+小版本號+build號。主版本號,代表當(dāng)前動態(tài)庫的版本,如果動態(tài)庫的接口有變化,那么這個(gè)版本號就要加1;后面的兩個(gè)版本號(小版本號 和 build 號)是告訴你詳細(xì)的信息,比如為一個(gè)hot-fix 而生成的一個(gè)版本,其小版本號加1,build號也應(yīng)有變化。 這個(gè)文件名包含共享庫的代碼。

第二個(gè)是動態(tài)庫的soname( Short for shared object name),其是應(yīng)用程序加載dll 時(shí)候,其尋找共享庫用的文件名。其格式為

lib + math+.so + ( major version number)

其只包含major version number,換句話說,也就是只要其接口沒有變,應(yīng)用程序都可以用,不管你其后minor build version or build version。

問題來了,程序運(yùn)行時(shí)怎么通過soname 找個(gè)real name? Soname 存在哪里?如果與real name 關(guān)聯(lián)起來?什么時(shí)候存的?

這就是接下來要介紹的第三個(gè)共享庫的名字,link name,顧名思義,就是在編譯過程,link 階段用的文件名。 其將sonmae 和real name 關(guān)聯(lián)起來。

第三個(gè)名字,共享庫的連接名(link name),是專門為build 階段連接而用的名字。這個(gè)名字就是lib + math +.so ,比如libmath.so。其是不帶任何版本信息的。在共享庫編譯過程中,連接(link) 階段,編譯器將生成一個(gè)共享庫及real name,同時(shí)將共享庫的soname,寫在共享庫文件里的文件頭里面??梢杂妹?readelf -d sharelibrary 去查看。

linux下sqlite如何制作成動態(tài)庫庫

1、下載源碼,解壓縮sqlite-autoconf-3300100.tar.gz

2、進(jìn)入解壓目錄,執(zhí)行:

#:./configure --host=arm CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ --prefix=/usr

其中--host=要運(yùn)行程序的主機(jī)

CC/CXX為用到的交叉編譯工具鏈

--prefix=安裝目錄

3、make

將在當(dāng)前文件目錄下,自動生成可執(zhí)行文件sqlite3及靜態(tài)庫文件sqlite3.a文件;

4、sudo make install

此命令會將可執(zhí)行文件及靜態(tài)庫文件拷貝至安裝目錄中(也可手動拷貝)

5、以上步驟生成的可執(zhí)行文件包含大量調(diào)試信息,文件比較大,可使用strip命令去掉其中的調(diào)試信息;

#:arm-linux-gnueabi-strip sqlite3

6、生成動態(tài)庫文件:

arm-linux-gnueabi-gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so

交叉編譯sqlite3,生成動態(tài)庫

標(biāo)簽:ref gcc host pthread strip config 安裝 目錄 工具鏈

Linux下fortran編譯鏈接

so文件是動態(tài)庫的集合,由f90文件編譯而成,此時(shí)f90程序中一般不包含program開頭的主程序,而只包含module,例如:

將f90源文件編譯為動態(tài)庫時(shí),使用命令

此時(shí)將生成兩個(gè)文件,分別為bisectmod.mod和lib***.so,這兒的***是剛才自定義的名字,而*.mod文件名則是f90文件中module的名字,是自動生成的,如果一個(gè)f90文件中包含N個(gè)module,則會生成N個(gè)*.mod和1個(gè)lib***.so。so文件作為庫文件,也可以由多個(gè)f90文件共同編譯得到,相當(dāng)于靜態(tài)庫中的打包,將多個(gè)庫打包到一個(gè)里,如下:

動態(tài)庫的使用包含兩部分,一是在編譯時(shí),二是在程序運(yùn)行時(shí)。

編譯包含動態(tài)庫的主程序時(shí),要同時(shí)制定mod文件的路徑和so文件的路徑,如果mod文件、so文件以及主程序文件在同一目錄下,直接指定so文件即可:

但是當(dāng)使用第三方庫時(shí),通常會分別存放在include和lib文件夾中,此時(shí)就要單獨(dú)指定路徑了:

第一個(gè)參數(shù)-I是大寫的i,代表include,第二個(gè)l是小寫的L,代表lib的名字,可以省略lib以及后面的.so,第三個(gè)-L則是lib.so文件的路徑。

這樣編譯的結(jié)果不能運(yùn)行,因?yàn)檫\(yùn)行時(shí)程序找不到lib***.so文件,最好的辦法是指定LD_LIBRARY_PATH環(huán)境變量,當(dāng)然也可以將lib***.so文件復(fù)制到系統(tǒng)的lib文件夾中。

linux動態(tài)庫編譯

Linux動態(tài)庫的編譯與使用 轉(zhuǎn)載

Linux下的動態(tài)庫以.so為后綴,我也是初次在Linux下使用動態(tài)庫,寫一點(diǎn)入門步驟,以便以后能方便使用。

第一步:編寫Linux程序庫

文件1.動態(tài)庫接口文件

//動態(tài)庫接口文件getmaxlen.h

#ifndef _GETMAXLEN_H_

#define _GETMAXLEN_H_

int getMaxLen(int *sel,int N);

#endif

文件2.動態(tài)庫程序?qū)崿F(xiàn)文件

//動態(tài)庫程序?qū)崿F(xiàn)文件getmaxlen.c

#include "getmaxlen.h"

int getMaxLen(int *sel,int N)

{

int n1=1,n2=1;

for(int i=1;iN;i++)

{

if(sel[i]sel[i-1])

{

n2 ++;

if(n2 n1)

{

n1 = n2;

}

}

else

{

n2 = 1;

}

}

return n1;

}

第二步:編譯生成動態(tài)庫

gcc getmaxlen.c –fPIC –shared –o libtest.so

由以上命令生成動態(tài)庫libtest.so,為了不需要動態(tài)加載動態(tài)庫,在命令時(shí)需以lib開頭以.so為后綴。

–fPIC:表示編譯為位置獨(dú)立的代碼,不用此選項(xiàng)的話編譯后的代碼是位置相關(guān)的所以動態(tài)載入時(shí)是通過代碼拷貝的方式來滿足不同進(jìn)程的需要,而不能達(dá)到真正代碼段共享的目的。

–shared:指明編譯成動態(tài)庫。

第三步:使用動態(tài)庫

1. 編譯時(shí)使用動態(tài)庫

文件1.動態(tài)庫使用文件test.c

//使用動態(tài)庫libtest.so,該文件名為test.c

#include "getmaxlen.h"

int main()

{

int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};

int m;

m = getMaxLen(Sel,15);

printf("%d",m);

return 0;

}

編譯命令:

gcc test.c –L . –l test –o test

–L:指明動態(tài)庫所在的目錄

-l:指明動態(tài)庫的名稱,該名稱是處在頭lib和后綴.so中的名稱,如上動態(tài)庫libtest.so的l參數(shù)為-l test。

測試:

ldd test

ldd 測試可執(zhí)行文件所使用的動態(tài)庫

2. 動態(tài)加載方式使用動態(tài)庫

文件內(nèi)容:

//動態(tài)庫的動態(tài)加載使用

int main()

{

void *handle = NULL;

int (*getMaxLen)(int *sel,int N);

int sel[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};

handle = dlopen("./libtest.so",RTLD_LAZY);

if(handle == NULL)

{

printf("dll loading error.\n");

return 0;

}

getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");

if(dlerror()!=NULL)

{

printf("fun load error.\n");

return 0;

}

printf("%d\n",getMaxLen(sel,15));

}

編譯命令:

gcc –ldl test1.c –o test

gcc -o test test.c ./libmytools.so

本文標(biāo)題:linux編譯動態(tài)庫命令 linux編譯動態(tài)庫連接
文章路徑:http://muchs.cn/article36/doeiosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、網(wǎng)頁設(shè)計(jì)公司電子商務(wù)、外貿(mào)建站、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)