linux共享庫

共享庫:

1.概念

2.生成一個(gè)共享庫

  • 代碼結(jié)構(gòu):
    實(shí)現(xiàn)一個(gè)四則運(yùn)算的共享庫:
├── add.cpp
├── common.h
├── dev.cpp
├── main.cpp
├── mul.cpp
└── sub.cpp

common.h文件:

#ifndef _COMMONH_
#define _COMMONH_

int add(int a,int b);

int sub(int a,int b);

int mul(int a,int b);

int dev(int a,int b);

#endif

add.cpp文件:

int add(int a,int b){
    return (a+b);
}

sub.cpp文件:

int sub(int a,int b){
    return (a-b);
}

mul.cpp文件:

int mul(int a,int b){
    return (a*b);
}

dev.cpp文件:

int dev(int a,int b){
    return (a/b);
}

main.cpp文件:

#include <iostream>
#include "common.h"

using namespace std;

int main(){
    cout << "begin():" <<endl;
    cout << "test add:"<<add(4,1)<<endl;
    cout << "test sub:"<<sub(4,1)<<endl;
    cout << "test mul:"<<mul(4,1)<<endl;
    cout << "test dev:"<<dev(4,1)<<endl;
    return 0;
}
  • 步驟:
    第一步:將函數(shù)庫代碼只編譯不鏈接,生成與位置無關(guān)的.o文件
#輸入命令:
g++ -fPIC -c add.cpp sub.cpp mul.cpp dev.cpp

說明:其中寒跳,fPIC 作用于編譯階段聘萨,告訴編譯器產(chǎn)生與位置無關(guān)代碼(Position-Independent Code),則產(chǎn)生的代碼中童太,沒有絕對地址米辐,全部使用相對地址胸完,故而代碼可以被加載器加載到內(nèi)存的任意位置,都可以正確的執(zhí)行翘贮。這正是共享庫所要求的赊窥,共享庫被加載時(shí),在內(nèi)存的位置不是固定的狸页。
結(jié)果:

├── add.cpp
├── add.o
├── common.h
├── dev.cpp
├── dev.o
├── main.cpp
├── mul.cpp
├── mul.o
├── sub.cpp
└── sub.o

第二步:生成共享庫

#輸入命令:
g++ -shared -Wl,-soname,libmycal.so.1 add.o sub.o mul.o dev.o -o libmycal.so.1.10 

說明:-shared表示生成共享庫锨能;-Wl表示告訴編譯器將后面的參數(shù)傳遞給鏈接器,于Wl來說芍耘,它的參數(shù)分割是用","址遇。-soname是告訴編譯器共享庫的soname是libmycal.so.1;生成的目標(biāo)文件是libmycal.so.1.10齿穗,是共享庫的realname傲隶。這里我們對soname和realname進(jìn)行說明:realname是動(dòng)態(tài)庫文件的真實(shí)的名字,記錄了共享庫的主版本和次版本號窃页,本例中l(wèi)ibmycal.so.1.10跺株,主版本號為1,次版本號為10脖卖;而soname只記錄了共享庫的主版本號乒省,本例中的soname為libmycal.so.1,只記錄了主版本號1(soname一般是個(gè)軟鏈接畦木,指向realname)袖扛。
結(jié)果:生成共享庫libmycal.so.1.10。

├── add.cpp
├── add.o
├── common.h
├── dev.cpp
├── dev.o
├── libmycal.so.1.10
├── main.cpp
├── mul.cpp
├── mul.o
├── sub.cpp
└── sub.o

若此時(shí)利用生成的共享庫與自己編寫的程序一起編譯十籍,則會(huì)報(bào)錯(cuò)蛆封,例如我們main.cpp與共享庫一起編譯:

#輸入命令:
g++ main.c libmycal.so.1.10 -o app

結(jié)果:生成目標(biāo)程序app

├── add.cpp
├── add.o
├── app
├── common.h
├── dev.cpp
├── dev.o
├── libmycal.so.1.10
├── main.cpp
├── mul.cpp
├── mul.o
├── sub.cpp
└── sub.o

此時(shí)執(zhí)行app,會(huì)報(bào)錯(cuò):

./app: error while loading shared libraries: libmycal.so.1: cannot open shared object file: No such file or directory

原因:有了共享庫勾栗,但沒有加入系統(tǒng)路徑惨篱。
接著我們查看app所依賴的庫:

#輸入命令:
ldd app

結(jié)果:

linux-vdso.so.1 (0x00007fff11b9c000)
libmycal.so.1 => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0a30697000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0a302a6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0a2ff08000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0a30c23000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0a2fcf0000)

我們看到libmycal.so.1 => not found,即libmycal.so.1這個(gè)庫系統(tǒng)沒有找到
第三步:修改系統(tǒng)配置文件围俘,將共享庫為系統(tǒng)所共享
首先修改配置文件砸讳,將當(dāng)前共享庫路徑加入配置文件

#輸入命令:
sudo vi /etc/ld.so.conf

說明:ld.so.conf為系統(tǒng)共享庫的配置文件,打開后將當(dāng)前路徑加入即可界牡。
之后更新庫:

#輸入命令:
sudo ldconfig -v

結(jié)果:自動(dòng)生成soname軟連接簿寂,即下面的libmycal.so.1(指向realname)

├── add.cpp
├── add.o
├── app
├── common.h
├── dev.cpp
├── dev.o
├── libmycal.so.1 -> libmycal.so.1.10
├── libmycal.so.1.10
├── main.cpp
├── mul.cpp
├── mul.o
├── sub.cpp
└── sub.o

此時(shí)再執(zhí)行app,可以得到結(jié)果:

begin():
test add:5
test sub:3
test mul:4
test dev:4

第四步:生成linkname

#輸入命令:
ln -s libmycal.so.1.10 libmycal.so

libmycal.so為linkname宿亡,linkname相比soname和realname常遂,沒有記錄庫的版本號,一般用于makefile中挽荠,soname只記錄主版本號烈钞,realname記錄主版本和次版本泊碑。linkname和soname均指向realname。
link name(libmycal.so)->real name(libmycal.so.1.10)
so name(libmycal.so.1)->real name(libmycal.so.1.10)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毯欣,一起剝皮案震驚了整個(gè)濱河市馒过,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酗钞,老刑警劉巖腹忽,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砚作,居然都是意外死亡窘奏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門葫录,熙熙樓的掌柜王于貴愁眉苦臉地迎上來着裹,“玉大人,你說我怎么就攤上這事米同『龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵面粮,是天一觀的道長少孝。 經(jīng)常有香客問我,道長熬苍,這世上最難降的妖魔是什么稍走? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮柴底,結(jié)果婚禮上婿脸,老公的妹妹穿的比我還像新娘。我一直安慰自己柄驻,他們只是感情好狐树,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凿歼,像睡著了一般褪迟。 火紅的嫁衣襯著肌膚如雪冗恨。 梳的紋絲不亂的頭發(fā)上答憔,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音掀抹,去河邊找鬼虐拓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛傲武,可吹牛的內(nèi)容都是我干的蓉驹。 我是一名探鬼主播城榛,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼态兴!你這毒婦竟也來了狠持?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞻润,失蹤者是張志新(化名)和其女友劉穎喘垂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍撞,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了傻铣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片章贞。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖非洲,靈堂內(nèi)的尸體忽然破棺而出鸭限,到底是詐尸還是另有隱情,我是刑警寧澤怪蔑,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布里覆,位于F島的核電站,受9級特大地震影響缆瓣,放射性物質(zhì)發(fā)生泄漏喧枷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一弓坞、第九天 我趴在偏房一處隱蔽的房頂上張望隧甚。 院中可真熱鬧,春花似錦渡冻、人聲如沸戚扳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽借。三九已至,卻和暖如春超歌,著一層夾襖步出監(jiān)牢的瞬間砍艾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工巍举, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脆荷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像蜓谋,于是被迫代替她去往敵國和親梦皮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容