久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

<th id="micwb"><sup id="micwb"></sup></th>
<menuitem id="micwb"></menuitem>
分享

(轉(zhuǎn)載) Linux下的 .o,、.a、.so文件說(shuō)明

 每天學(xué)一點(diǎn)7 2013-11-14
工程里很多函數(shù)只是有聲明,,找不到實(shí)現(xiàn)的代碼,。因?yàn)槟切?shí)現(xiàn)代碼已經(jīng)編譯成庫(kù)所以看不見(jiàn),我所看見(jiàn)的全是一堆頭文件.

     .o,、.a,、.so文件都是Linux下的程序函數(shù)庫(kù),即編譯好的可以供其他程序使用的代碼和數(shù)據(jù),。

優(yōu)點(diǎn):程序模塊化,,容易重新編譯,方便升級(jí),。

分類:靜態(tài)函數(shù)庫(kù)(對(duì)應(yīng).a文件),、共享函數(shù)庫(kù)(對(duì)應(yīng).so文件,類似于Windowsdll文件),、動(dòng)態(tài)加載函數(shù)庫(kù)(對(duì)應(yīng).o文件,,相當(dāng)于Windows里的.obj文件)

 

靜態(tài)函數(shù)庫(kù)

特點(diǎn):實(shí)際上是簡(jiǎn)單的普通目標(biāo)文件的集合,在程序執(zhí)行前就加入到目標(biāo)程序中,。

優(yōu)點(diǎn):可以用以前某些程序兼容,;描述簡(jiǎn)單;允許程序員把程序link起來(lái)而不用重新編譯代碼,,節(jié)省了重新編譯代碼的時(shí)間(該優(yōu)勢(shì)目前已不明顯),;開(kāi)發(fā)者可以對(duì)源代碼保密;理論上使用ELF格式的靜態(tài)庫(kù)函數(shù)生成的代碼可以比使用共享或動(dòng)態(tài)函數(shù)庫(kù)的程序運(yùn)行速度快(大概1%-5%

生成:使用ar程序(archiver的縮寫(xiě)),。ar rcs my_lib.a f1.o f2.o是把目標(biāo)代碼f1.of2.o加入到my_lib.a這個(gè)函數(shù)庫(kù)文件中(如果my_lib.a不存在則創(chuàng)建)

使用:gcc生成可執(zhí)行代碼時(shí),,使用-l參數(shù)指定要加入的庫(kù)函數(shù),。也可以用ld命令的-l-L參數(shù)。

 

共享函數(shù)庫(kù)

    共享函數(shù)庫(kù)在可執(zhí)行程序啟動(dòng)的時(shí)候加載,,所有程序重新運(yùn)行時(shí)都可自動(dòng)加載共享函數(shù)庫(kù)中的函數(shù),。.so文件感覺(jué)很復(fù)雜,光是命名規(guī)則就已經(jīng)看得我很暈了~整理一下,,共享庫(kù)需要:soname,、real name,另外編譯的時(shí)候名字也有說(shuō)法,。依次解釋下:

soname必須的格式:lib+函數(shù)庫(kù)名+.so+版本號(hào)信息(但是記住,,非常底層的C庫(kù)函數(shù)都不是以lib開(kāi)頭命名的)。例子:/usr/lib/libreadline.so.3

real name:顧名思義是真正的名字啦,,有主版本號(hào)和發(fā)行版本號(hào),。但是沒(méi)找到實(shí)例……

編譯器編譯的時(shí)候需要的函數(shù)庫(kù)的名字就是不包含版本號(hào)信息的soname,例如上面的例子把最后的.3去掉就可以了,。

位置:共享函數(shù)庫(kù)文件必須放在特定目錄,,對(duì)于開(kāi)放源碼來(lái)說(shuō),GNU標(biāo)準(zhǔn)建議所有的函數(shù)庫(kù)文件都放在/usr/local/lib目錄下,,而且建議命令,、可執(zhí)行程序都放在/usr/local/bin目錄下。不過(guò)這個(gè)只是習(xí)慣啦,,可以改變,,具體的位置信息可以看/etc/ld.so.conf里面的配置信息。當(dāng)然,,也可以修改這個(gè)文件,,加入自己的一些特殊的路徑要求。

創(chuàng)建:在網(wǎng)上找到了gcc方式和easyeclipse環(huán)境下兩種創(chuàng)建方式,。

gcc方式:

    首先創(chuàng)建object文件,,這個(gè)文件將加入通過(guò)gcc –fPIC 參數(shù)命令加入到共享函數(shù)庫(kù)里面,標(biāo)準(zhǔn)格式:gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list(說(shuō)實(shí)話這個(gè)標(biāo)準(zhǔn)格式看起來(lái)好復(fù)雜,,我找了個(gè)實(shí)例,,但是好像和那個(gè)標(biāo)準(zhǔn)格式稍有不同:gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

easyeclipse環(huán)境下生成.so文件:

        1.選擇新建工程,建立一個(gè)c++工程

        2.在工程類型選項(xiàng)里選擇 Shared Library,,然后填入工程名字PXXX點(diǎn)擊完成即可,。

        3.編寫(xiě)程序,然后編譯就會(huì)在debug或者release里生成一個(gè)libPXXX.so文件,,如果不要lib的起頭標(biāo)記點(diǎn)擊project菜單的Properties選項(xiàng),然后在彈出的界面的右邊點(diǎn)擊Build artifact頁(yè)面,,將Output prefix選項(xiàng)的內(nèi)容清空即可,。

        4.如果是C++程序,,注意在接口函數(shù)的前面加上extern "C"標(biāo)記,在頭文件加上如下標(biāo)記:

#ifdef   __cplusplus  

#extern   "C"{  

#endif  

   

頭文件主體  

   

#ifdef   __cplusplus  

 

#endif  

     如果不加以上標(biāo)記,,經(jīng)過(guò)編譯后,,so里的函數(shù)名并非你編寫(xiě)程序時(shí)設(shè)定的函數(shù)名,在開(kāi)發(fā)環(huán)境左側(cè)的工程文件列表中點(diǎn)開(kāi)debug項(xiàng)里的PXXX.o可以看到so文件里的函數(shù)名都是在你設(shè)定的函數(shù)名后面加了一個(gè)__Fi標(biāo)記,,比如你用的設(shè)定的函數(shù)名稱是Func(),so里的函數(shù)名則為Func__Fi()或者其他的名稱,。

安裝:拷貝共享庫(kù)文件到指定的標(biāo)準(zhǔn)的目錄,然后運(yùn)行ldconfig,。如果沒(méi)有權(quán)限這樣做,,那么就只好通過(guò)修改環(huán)境變量來(lái)實(shí)現(xiàn)這些函數(shù)庫(kù)的使用了。方法不再說(shuō)了,,很復(fù)雜,。

查看:可以通過(guò)運(yùn)行ldd來(lái)看某個(gè)程序使用的共享函數(shù)庫(kù)。例如ldd /bin/ls,。查看.so文件使用nm命令,,如nm libXXX.so。(注意,,nm對(duì)于靜態(tài)的函數(shù)庫(kù)和共享的函數(shù)庫(kù)都起作用)

關(guān)于覆蓋:如果想用自己的函數(shù)覆蓋某個(gè)庫(kù)中的一些函數(shù),,同時(shí)保留該庫(kù)中其他的函數(shù)的話,可以在/etc/ld.so.preload中加入要替換的庫(kù)(.o結(jié)尾的文件),,這些preloading的庫(kù)函數(shù)將有優(yōu)先加載的權(quán)利,。

關(guān)于更新:每次新增加動(dòng)態(tài)加載的函數(shù)庫(kù)、刪除某個(gè)函數(shù)庫(kù)或者修改某個(gè)函數(shù)庫(kù)的路徑時(shí),,都要重新運(yùn)行ldconfig來(lái)更新/etc/ld.so.cache

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多