G++粤剧,靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)

G++(Linux)

-I(大寫i)挥唠,到指定目錄搜索頭文件
-L抵恋,到指定目錄搜索庫(kù)文件
-l(小寫L),到前面指定的目錄下添加庫(kù)文件進(jìn)行鏈接
-o宝磨,為生成文件重命名
???g++ -E xxx.cpp
???不加-o 生成xxx.i
???加-o xxx123 生成xxx123
-E弧关,將源代碼 .c/.cpp文件進(jìn)行預(yù)編譯
???將所有#define刪除
???并且展開(kāi)所有的宏定義處理所有的條件預(yù)編譯指令,如#if #ifdef #undef #ifndef #endif #elif處理#include
???將包含的文件插入到此處唤锉,這是一個(gè)遞歸的過(guò)程
???刪除所有注釋 // /* */添加行號(hào)和文件名標(biāo)識(shí)世囊,以便于編譯時(shí)產(chǎn)生的錯(cuò)誤警告能顯示行號(hào)
???保留#pragma編譯器指令
???g++ -E xxx.cpp 生成xxx.i
-S,將預(yù)處理完的.i文件進(jìn)行一系列的詞法分析窿祥、語(yǔ)法分析株憾、語(yǔ)義分析及優(yōu)化后生成響應(yīng)的匯編代碼文件
???g++ -S xxx.cpp/xxx.i 生成xxx.s
-c,生成目標(biāo)文件 以xxx.o結(jié)尾晒衩,可以用于生成庫(kù)文件
???g++ -c xxx.cpp/xxx.s 生成xxx.o

靜態(tài)庫(kù)

在g++ -c命令創(chuàng)建完.o結(jié)尾的目標(biāo)文件后嗤瞎,可以通過(guò)ar命令打包成靜態(tài)庫(kù)
實(shí)際上ar命令是用于創(chuàng)建備存文件的,將一些文件打包成一個(gè)文件听系,類似于壓縮文件贝奇,但不完全等于壓縮文件
實(shí)際上在調(diào)用g++ -l(小寫L)指令的時(shí)候?qū)浯嫖募械?o文件提取出來(lái)進(jìn)行鏈接操作
但是在鏈接中需要用到-L來(lái)指示庫(kù)文件所在目錄,用-l(小寫L)來(lái)指定庫(kù)文件
而-l(小寫L)時(shí)會(huì)補(bǔ)充xxx前后的lib與.a靠胜,所以在使用ar命令來(lái)打包靜態(tài)庫(kù)的時(shí)候需要直接命名為libxxx.a
在實(shí)際上以下兩種鏈接方法完全等效

$ g++ main.cpp -L./lib -lmath

$ g++ main.cpp math.o

一般對(duì).o結(jié)尾的目標(biāo)文件生成靜態(tài)庫(kù)的時(shí)候弃秆,使用以下參數(shù)
ar rcs [備存文件] [成員文件]
(靜態(tài)庫(kù)文件名) (目標(biāo)文件名)
例 ar rcs libmath.a math.o

更多ar命令届惋,請(qǐng)看以下
Linux ar命令

動(dòng)態(tài)庫(kù)

動(dòng)態(tài)庫(kù)編譯方式如同靜態(tài)庫(kù)一樣,先要編譯出目標(biāo)文件.o菠赚,然后組成.so庫(kù)—— g++ -c math.cpp -o math.o
但是這次編譯需要用到-fPIC指令來(lái)編譯脑豹,在g++ -fPIC -c math.cpp -o math.o
獲得了目標(biāo)文件.o后,需要用指令-shared聲明將.o文件鏈接成.so庫(kù)衡查,g++ -shared -o libmath.so math.o
實(shí)際上生成.so庫(kù)可以合成一個(gè)指令瘩欺,g++ -fPIC -shared math.cpp -o libmath.so
編譯main.cpp時(shí),需要和鏈接靜態(tài)庫(kù)一樣拌牲,要用到-L與-l(小寫L)俱饿,但是要添加-ldl,g++ math.cpp -L ./so/ -lmath -ldl
關(guān)于載入動(dòng)態(tài)庫(kù)的規(guī)則:
在Linux中塌忽,系統(tǒng)會(huì)按照一定方式搜索動(dòng)態(tài)庫(kù)文件

  • (僅限ELF)如果調(diào)用程序的可執(zhí)行文件包含 DT_RPATH 標(biāo)記拍埠,并且不包含 DT_RUNPATH 標(biāo)記,則會(huì)搜索 DT_RPATH 標(biāo)記中列出的目錄土居。
  • 如果在程序啟動(dòng)時(shí)枣购,環(huán)境變量 LD_LIBRARY_PATH 被定義為包含以冒號(hào)分隔的目錄列表,則會(huì)搜索這些目錄擦耀。 (作為安全措施棉圈,set-user-ID 和 set-group-ID程序?qū)⒑雎源俗兞俊#?/li>
  • (僅限ELF)如果調(diào)用程序的可執(zhí)行文件包含?DT_RUNPATH?標(biāo)記眷蜓,則搜索該標(biāo)記中列出的目錄分瘾。
  • 檢查緩存文件/etc/ld.so.cache(由ldconfig(8)維護(hù))以查看它是否包含filename的條目。
  • 搜索目錄 /lib和 /usr/lib(按此順序)吁系。
    例如創(chuàng)建環(huán)境變量 LD_LIBRARY_PATH 德召,在中間加入動(dòng)態(tài)庫(kù)的目錄,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./so

在執(zhí)行調(diào)用動(dòng)態(tài)庫(kù)時(shí)汽纤,需要對(duì)以上規(guī)則內(nèi)的目錄進(jìn)行添加對(duì)應(yīng)動(dòng)態(tài)庫(kù)上岗,也可以用ldd命令查看可執(zhí)行文件中調(diào)用的動(dòng)態(tài)庫(kù)是否存在對(duì)應(yīng)的文件,ldd a.out

如何執(zhí)行動(dòng)態(tài)庫(kù)中的程序冒版?
一、隱式執(zhí)行
二逞姿、顯示執(zhí)行

一辞嗡、隱式執(zhí)行

庫(kù)文件中的可執(zhí)行函數(shù)都聲明為靜態(tài)(static),int main()中直接調(diào)用該靜態(tài)函數(shù)滞造,道理懂得都懂续室。

二、顯示執(zhí)行

使用<dlfcn.h>函數(shù)庫(kù)中各種庫(kù)函數(shù)谒养,加載動(dòng)態(tài)庫(kù)挺狰,執(zhí)行動(dòng)態(tài)庫(kù)中程序etc.
介紹幾個(gè)常用動(dòng)態(tài)庫(kù)函數(shù)
1.dlopen
??void* dlopen(const char* filename,int mode)
??filename 為動(dòng)態(tài)庫(kù)名明郭,mode為載入動(dòng)態(tài)庫(kù)的方式模式。

??mode:
??1丰泊、解析方式
??RTLD_LAZY:在dlopen返回前薯定,對(duì)于動(dòng)態(tài)庫(kù)中的未定義的符號(hào)不執(zhí)行解析(只對(duì)函數(shù)引用有效,對(duì)于變量引用總是立即解析)瞳购。
??RTLD_NOW: 需要在dlopen返回前话侄,解析出所有未定義符號(hào),如果解析不出來(lái)学赛,在dlopen會(huì)返回NULL年堆,錯(cuò)誤為:: undefined symbol: xxxx.......
??2、作用范圍盏浇,可與解析方式通過(guò)“|”組合使用变丧。
??RTLD_GLOBAL:動(dòng)態(tài)庫(kù)中定義的符號(hào)可被其后打開(kāi)的其它庫(kù)解析。
??RTLD_LOCAL: 與RTLD_GLOBAL作用相反绢掰,動(dòng)態(tài)庫(kù)中定義的符號(hào)不能被其后打開(kāi)的其它庫(kù)重定位痒蓬。如果沒(méi)有指明是RTLD_GLOBAL還是RTLD_LOCAL,則缺省為RTLD_LOCAL曼月。
??3谊却、作用方式
??RTLD_NODELETE: 在dlclose()期間不卸載庫(kù)胰舆,并且在以后使用dlopen()重新加載庫(kù)時(shí)不初始化庫(kù)中的靜態(tài)變量妹田。這個(gè)flag不是POSIX-2001標(biāo)準(zhǔn)酿秸。
??RTLD_NOLOAD: 不加載庫(kù)粤咪〔牌幔可用于測(cè)試庫(kù)是否已加載(dlopen()返回NULL說(shuō)明未加載哎垦,否則說(shuō)明已加載)柒昏,也可用于改變已加載庫(kù)的flag显蝌,如:先前加載庫(kù)的flag為RTLD_LOCAL末购,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag將變成RTLD_GLOBAL破喻。這個(gè)flag不是POSIX-2001標(biāo)準(zhǔn)。
??RTLD_DEEPBIND:在搜索全局符號(hào)前先搜索庫(kù)內(nèi)的符號(hào)盟榴,避免同名符號(hào)的沖突曹质。這個(gè)flag不是POSIX-2001標(biāo)準(zhǔn)。

??dlopen執(zhí)行后返回一個(gè)handle

2.dlsym
??void* dlsym(void* handle,const char* symbol)
??執(zhí)行完后返回handle中的對(duì)應(yīng)symbol符號(hào)的地址
??其中handle就是dlopen執(zhí)行完后的handle擎场,symbol就是要求獲取的函數(shù)或全局變量的名稱
??關(guān)于symbol羽德,其中有說(shuō)法的是符號(hào)名
??因?yàn)樵赾++中為了保證多態(tài)性,函數(shù)都能進(jìn)行重載迅办,所以在c++中的符號(hào)名不是完全按照函數(shù)名來(lái)命名宅静,會(huì)按照不同編譯器的方式進(jìn)行改編
??而c中不需要保證多態(tài)性,所以符號(hào)名都為函數(shù)名站欺。
??所以在需要進(jìn)行c方式編譯的代碼段姨夹,用 extern "C" 來(lái)聲明這一段代碼用C語(yǔ)言來(lái)編譯纤垂,使用dlsym時(shí),便可以通過(guò)函數(shù)名來(lái)調(diào)用庫(kù)中的函數(shù)

3.dlclose
??int dlclose (void *handle)
??傳入handle磷账,卸載handle所指的動(dòng)態(tài)庫(kù)內(nèi)存區(qū)域

4.dlerror
??char *dlerror(void)
??返回錯(cuò)誤信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峭沦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子够颠,更是在濱河造成了極大的恐慌熙侍,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件履磨,死亡現(xiàn)場(chǎng)離奇詭異蛉抓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剃诅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門巷送,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人矛辕,你說(shuō)我怎么就攤上這事笑跛。” “怎么了聊品?”我有些...
    開(kāi)封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵飞蹂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我翻屈,道長(zhǎng)陈哑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任伸眶,我火速辦了婚禮惊窖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厘贼。我一直安慰自己界酒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布嘴秸。 她就那樣靜靜地躺著毁欣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岳掐。 梳的紋絲不亂的頭發(fā)上凭疮,一...
    開(kāi)封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音岩四,去河邊找鬼哭尝。 笑死哥攘,一個(gè)胖子當(dāng)著我的面吹牛剖煌,可吹牛的內(nèi)容都是我干的材鹦。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼耕姊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桶唐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起茉兰,我...
    開(kāi)封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尤泽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后规脸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坯约,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年莫鸭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闹丐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡被因,死狀恐怖卿拴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梨与,我是刑警寧澤堕花,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站粥鞋,受9級(jí)特大地震影響缘挽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陷虎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一到踏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尚猿,春花似錦窝稿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至庄萎,卻和暖如春踪少,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糠涛。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工援奢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忍捡。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓集漾,卻偏偏與公主長(zhǎng)得像切黔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子具篇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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