• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            Linux下動(dòng)態(tài)庫使用小結(jié)

            1. 靜態(tài)庫和動(dòng)態(tài)庫的基本概念

            靜態(tài)庫,是在可執(zhí)行程序連接時(shí)就已經(jīng)加入到執(zhí)行碼中,在物理上成為執(zhí)行程序的一部分;使用靜態(tài)庫編譯的程序運(yùn)行時(shí)無需該庫文件支持,哪里都可以用,但是生成的可執(zhí)行文件較大。動(dòng)態(tài)庫,是在可執(zhí)行程序啟動(dòng)時(shí)加載到執(zhí)行程序中,可以被多個(gè)可執(zhí)行程序共享使用。使用動(dòng)態(tài)庫編譯生成的程序相對(duì)較小,但運(yùn)行時(shí)需要庫文件支持,如果機(jī)器里沒有這些庫文件就不能運(yùn)行。

             

            2.  如何使用動(dòng)態(tài)庫

            如何程序在連接時(shí)使用了共享庫,就必須在運(yùn)行的時(shí)候能夠找到共享庫的位置。linux的可執(zhí)行程序在執(zhí)行的時(shí)候默認(rèn)是先搜索/lib和/usr/lib這兩個(gè)目錄,然后按照/etc/ld.so.conf里面的配置搜索絕對(duì)路徑。同時(shí),Linux也提供了環(huán)境變量LD_LIBRARY_PATH供用戶選擇使用,用戶可以通過設(shè)定它來查找除默認(rèn)路徑之外的其他路徑,如查找/work/lib路徑,你可以在/etc/rc.d/rc.local或其他系統(tǒng)啟動(dòng)后即可執(zhí)行到的腳本添加如下語句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路徑優(yōu)先于系統(tǒng)默認(rèn)路徑之前查找(詳細(xì)參考《使用LD_LIBRARY_PATH》)。

            不過LD_LIBRARY_PATH的設(shè)定作用是全局的,過多的使用可能會(huì)影響到其他應(yīng)用程序的運(yùn)行,所以多用在調(diào)試。(LD_LIBRARY_PATH的缺陷和使用準(zhǔn)則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項(xiàng)來在編譯時(shí)就指定庫的查找路徑,并且該庫的路徑信息保存在可執(zhí)行文件中,運(yùn)行時(shí)它會(huì)直接到該路徑查找?guī)欤苊饬耸褂肔D_LIBRARY_PATH環(huán)境變量查找。

             

            3.庫的鏈接時(shí)路徑和運(yùn)行時(shí)路徑

            現(xiàn)代連接器在處理動(dòng)態(tài)庫時(shí)將鏈接時(shí)路徑(Link-time path)和運(yùn)行時(shí)路徑(Run-time path)分開,用戶可以通過-L指定連接時(shí)庫的路徑,通過-R(或-rpath)指定程序運(yùn)行時(shí)庫的路徑,大大提高了庫應(yīng)用的靈活性。比如我們做嵌入式移植時(shí)#arm-linux-gcc $(CFLAGS) –o target  –L/work/lib/zlib/ -llibz-1.2.3  (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好后我們只要把zlib庫拷貝到開發(fā)板的系統(tǒng)默認(rèn)路徑下即可。或者通過-rpath(或-R )、LD_LIBRARY_PATH指定查找路徑。

             

            小問題:

            1.編譯時(shí)的-L選項(xiàng)是否影響LD_LIBRARY_PATH的值?

            舉一個(gè)實(shí)例:

            當(dāng)前文件夾結(jié)構(gòu)如下:

            test.c tools/

            tool下有tool.c tool.h my_err.h 以及由此生成的libtool.so

            tool下編譯生成庫文件

            gcc -Wall -g -shared -o tool.so tool.c

            在當(dāng)前文件夾引用:

            gcc -Wall -g –o  test.c -Ltools -ltool

            編譯不報(bào)錯(cuò),但是運(yùn)行加載的時(shí)候就出現(xiàn)cannot open shared object file。

            如果將該庫文件拷貝到/usr/lib下就沒有錯(cuò)誤,正常運(yùn)行。

             

            說明編譯時(shí)的-L選項(xiàng)并不影響環(huán)境變量LD_LIBRARY_PATH,-L只是指定了程序編譯連接時(shí)庫的路徑,并不影響程序執(zhí)行時(shí)庫的路徑,系統(tǒng)還是會(huì)到默認(rèn)路徑下查找該程序所需要的庫。

            posted on 2011-01-05 11:28 大龍 閱讀(509) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            精品久久久久国产免费| 婷婷综合久久中文字幕蜜桃三电影| 国产精品久久久久久久app| 色综合久久综合网观看| 国产情侣久久久久aⅴ免费| 久久精品无码一区二区WWW| 一级女性全黄久久生活片免费| 久久久久亚洲精品男人的天堂| 国产精品美女久久久久AV福利| 热久久国产精品| 国产激情久久久久影院小草| 日本精品久久久久中文字幕8| 日本精品久久久久中文字幕| 久久国产亚洲精品麻豆| 欧美精品一本久久男人的天堂| 久久精品嫩草影院| 国产精品免费久久久久电影网| 久久免费美女视频| 欧美精品一区二区久久| 久久无码一区二区三区少妇 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久福利青草精品资源站免费| 国产精品久久久久无码av| 一级做a爰片久久毛片人呢| 国产精品99久久99久久久| 久久综合久久综合久久| 久久久无码精品午夜| 老男人久久青草av高清| 亚洲AV无码1区2区久久| 亚洲国产精品久久久久婷婷老年| 国产亚洲美女精品久久久久狼| 国产精品亚洲综合专区片高清久久久 | 久久人妻少妇嫩草AV蜜桃| 久久AV无码精品人妻糸列| 国产99久久精品一区二区| 欧美日韩精品久久久免费观看 | 噜噜噜色噜噜噜久久| 久久精品国产91久久综合麻豆自制| 久久久国产视频| 久久精品国产亚洲AV无码偷窥| 伊人久久无码中文字幕|