• <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>

            大龍的博客

            常用鏈接

            統計

            最新評論

            Linux下動態庫使用小結

            1. 靜態庫和動態庫的基本概念

            靜態庫,是在可執行程序連接時就已經加入到執行碼中,在物理上成為執行程序的一部分;使用靜態庫編譯的程序運行時無需該庫文件支持,哪里都可以用,但是生成的可執行文件較大。動態庫,是在可執行程序啟動時加載到執行程序中,可以被多個可執行程序共享使用。使用動態庫編譯生成的程序相對較小,但運行時需要庫文件支持,如果機器里沒有這些庫文件就不能運行。

             

            2.  如何使用動態庫

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

            不過LD_LIBRARY_PATH的設定作用是全局的,過多的使用可能會影響到其他應用程序的運行,所以多用在調試。(LD_LIBRARY_PATH的缺陷和使用準則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項來在編譯時就指定庫的查找路徑,并且該庫的路徑信息保存在可執行文件中,運行時它會直接到該路徑查找庫,避免了使用LD_LIBRARY_PATH環境變量查找。

             

            3.庫的鏈接時路徑和運行時路徑

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

             

            小問題:

            1.編譯時的-L選項是否影響LD_LIBRARY_PATH的值?

            舉一個實例:

            當前文件夾結構如下:

            test.c tools/

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

            tool下編譯生成庫文件

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

            在當前文件夾引用:

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

            編譯不報錯,但是運行加載的時候就出現cannot open shared object file。

            如果將該庫文件拷貝到/usr/lib下就沒有錯誤,正常運行。

             

            說明編譯時的-L選項并不影響環境變量LD_LIBRARY_PATH,-L只是指定了程序編譯連接時庫的路徑,并不影響程序執行時庫的路徑,系統還是會到默認路徑下查找該程序所需要的庫。

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

            久久精品亚洲精品国产色婷 | 久久天天躁狠狠躁夜夜不卡| 国产精品欧美久久久久无广告| 欧洲国产伦久久久久久久| 久久精品一区二区三区AV| 国产成人精品久久一区二区三区| 久久伊人影视| 精品国产99久久久久久麻豆| 久久夜色精品国产欧美乱| 青青青青久久精品国产h久久精品五福影院1421 | 伊人久久大香线蕉综合Av| 久久精品国产欧美日韩| 久久久精品午夜免费不卡| 久久人妻少妇嫩草AV无码专区| 丁香狠狠色婷婷久久综合| 色婷婷综合久久久久中文字幕 | 91精品无码久久久久久五月天| 日韩精品久久久肉伦网站| 热久久国产精品| 国产麻豆精品久久一二三| 久久人爽人人爽人人片AV| 久久精品无码一区二区三区免费| 青草国产精品久久久久久| 色综合久久天天综线观看| 国内精品久久人妻互换| 免费无码国产欧美久久18| 久久国产免费直播| 久久精品无码一区二区三区日韩| 久久精品国产91久久麻豆自制| 久久99精品国产一区二区三区| 久久婷婷色香五月综合激情| 久久夜色精品国产噜噜亚洲a | 久久天天躁狠狠躁夜夜2020老熟妇 | 99精品国产99久久久久久97| 国产一区二区精品久久岳| 久久久久亚洲av成人无码电影 | 久久九九有精品国产23百花影院| 久久香综合精品久久伊人| 亚洲中文字幕无码一久久区| av色综合久久天堂av色综合在| 亚洲精品无码久久一线|