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

            Error

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            運(yùn)行時(shí)使用非標(biāo)準(zhǔn)位置/usr/lib和/lib下的庫(kù)的方式有三種:
            (1) 設(shè)置$LD_LIBRARY_PATH=庫(kù)所在目錄(多個(gè)目錄用:分隔),系統(tǒng)加載工具ld.so/ld-linux.so將順序搜索變量指定的目錄。例如#$LD_LIBRARY_PATH=/usr/local/mysql/lib ./test_mysql
            (2) 以root身份把庫(kù)路徑加入/etc/ld.so.conf或在/etc/ld.so.conf.d中創(chuàng)建特定的.conf文件,然后運(yùn)行l(wèi)dconfig更新/etc/ld.so.cache。例如:在/etc/ld.so.conf.d下創(chuàng)建文件mysql.conf寫入/usr/local/mysql/lib
            (3) 另一種辦法就是把需要的庫(kù)copy到/usr/lib或/lib,但這不是建議的方法,特別是盡量避免copy發(fā)到/lib。但這種方法可以在編譯時(shí)免去用-L選項(xiàng)。



            linux中動(dòng)態(tài)鏈接庫(kù)的搜索順序

             (2008-12-23 10:03:20)
            標(biāo)簽: 

            雜談

            linux中動(dòng)態(tài)鏈接庫(kù)的搜索順序 
            //
            // by kirk,2008.11.21,文中有bug請(qǐng)搞緊與我聯(lián)系:-)
            //   
              

                在接手一個(gè)很古老的程序時(shí),發(fā)現(xiàn)其所使用的動(dòng)態(tài)庫(kù)都實(shí)在是太陳舊了,正式運(yùn)行環(huán)境中部署的庫(kù)都是相適應(yīng)的,而目前的開發(fā)測(cè)試環(huán)境中均是部署的新的升級(jí)版本。為了能在這些環(huán)境下開發(fā)測(cè)試,程序得能在自定義的路徑里來(lái)搜索。因此在這里復(fù)習(xí)一下linux中程序?qū)?dòng)態(tài)鏈接庫(kù)的搜索順序,如下所述:

               1.首先查看程序文件的.dynamic 段是否包含了一個(gè)叫DT_RPATH的項(xiàng)(它是一個(gè)以冒號(hào)分隔的庫(kù)文件搜索目錄列表)。

               怎么設(shè)置這個(gè)選項(xiàng)?

               需要在編譯連接程序的時(shí)候使用-Wl,-rpath選項(xiàng),假設(shè)一個(gè)程序test需要使用liblib.so庫(kù),如下所示進(jìn)行編譯連接:

                

            g++ -o test -L. -llib -Wl,rpath=./ test.cpp
             

                 這樣在執(zhí)行test程序時(shí),test便會(huì)先到./即當(dāng)前目錄下查找所需要的動(dòng)態(tài)庫(kù)liblib.so

                2.查找是否存在環(huán)境變量 LD_LIBRARY_PATH(它是一個(gè)以冒號(hào)分隔的庫(kù)文件搜索目錄列表)。

               怎么設(shè)置這個(gè)選項(xiàng)?當(dāng)然是設(shè)置linux下的環(huán)境變量就可以了。

            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
             

                  當(dāng)然,這種方法是對(duì)當(dāng)前登錄生效的。如果想開機(jī)即有效,跟其它環(huán)境變量的設(shè)置也是一樣,需要修改一些配置文件。

                3.查看庫(kù)高速緩存文件 /etc/ld.so.conf ,它包含了庫(kù)名和路徑的一個(gè)對(duì)應(yīng)列表,如果庫(kù)名存在,連接器就使用它對(duì)應(yīng)的路徑,用這個(gè)查找方法能夠找到大部分的庫(kù)。

               怎么設(shè)置這個(gè)選項(xiàng)?可以直接編輯ld.so.conf加入需要查找的路徑,也可以在/etc/ld.so.conf.d目錄下的己有文件中加入路徑,或者在該目錄下新建一個(gè)文件(名字為*.conf即可),再把需要的路徑加入到該文件中。最后執(zhí)行l(wèi)dconfig即可生效。

                4.查找默認(rèn)路徑/lib和/usr/lib,

                如果經(jīng)過了以上的步驟仍然查找失敗,則將報(bào)錯(cuò)并退出相關(guān)程序。

                對(duì)于前三個(gè)步驟來(lái)說,我們均是可以進(jìn)行設(shè)置調(diào)整的,其中第三個(gè)步驟中的設(shè)置需要root權(quán)限才能進(jìn)行,且會(huì)影響所有的程序。當(dāng)使用第一、第二中的方法進(jìn)行了設(shè)置調(diào)整后,我們便可以使多種版本的庫(kù)共存在同一環(huán)境下進(jìn)行測(cè)試,同名也無(wú)所謂。
             *********************************************************************

            環(huán)境變量LD_LIBRARY_PATH用來(lái)指定查找共享庫(kù)時(shí)除了默認(rèn)路徑之外的其他路徑。(該路徑在默認(rèn)路徑之前查找)
            移植程序時(shí)的經(jīng)常碰到需要使用一些特定的動(dòng)態(tài)庫(kù),而這些編譯好的動(dòng)態(tài)庫(kù)放在我們自己建立的目錄里,這時(shí)我們可以設(shè)置LD_LIBRARY_PATH
            例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/
            這樣就可以使用/work/lib/下的庫(kù)文件了,運(yùn)行程序后系統(tǒng)會(huì)自動(dòng)到環(huán)境變量LD_LIBRARY_PATH指定的路徑中查找其所需的庫(kù)。
            系統(tǒng)查找動(dòng)態(tài)庫(kù)的順序
            系統(tǒng)先找LD_LIBRARY_PATH下的庫(kù)再找/lib and /usr/lib等路徑下的庫(kù),還有/etc/ld.so.conf里指定的路徑(如果ld.so.conf存在),man ldconfig for more information
            [url=http://infomax/bbs/misc.php?action=viewratings&tid=111&pid=228][/url]
            使Linux啟動(dòng)之后就加載LD_LIBRARY_PATH的路徑
            /etc/rc.d/rc.local文件中加入export   LD_LIBRARY_PATH="xxxxx"  即可
            如果在鏈接時(shí)使用了"-R"和"-L"選項(xiàng),則相關(guān)動(dòng)態(tài)庫(kù)的路徑將保存在ELF文件中,于
            是以后的運(yùn)行中不再需要設(shè)置環(huán)境變量去定位動(dòng)態(tài)庫(kù)。比如,有一個(gè)
            /usr/local/lib/libfoo.so,而你的bar程序需要這個(gè)libfoo.so,編譯、鏈接時(shí)最好
            這樣 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo
            (#man gcc ,沒發(fā)現(xiàn)-R或-rpath選項(xiàng),待查)


            posted on 2015-08-18 17:42 Enic 閱讀(1116) 評(píng)論(0)  編輯 收藏 引用 所屬分類: linux
            91久久精品91久久性色| 久久这里有精品视频| 国产精品美女久久久| 91久久精品国产成人久久| 亚洲精品视频久久久| 99久久99久久| 欧美一区二区久久精品| 国产精品久久久久久吹潮| 99久久精品费精品国产| 久久久久99这里有精品10| 久久精品无码一区二区三区| 久久久久亚洲AV无码去区首| 久久精品毛片免费观看| 亚洲欧美国产精品专区久久| 久久99国产精品久久99果冻传媒 | 久久久久久伊人高潮影院| 久久成人精品视频| 狠狠综合久久AV一区二区三区| 久久国产免费直播| 日本久久久久久中文字幕| 久久精品无码专区免费东京热| 合区精品久久久中文字幕一区| 99久久精品国产一区二区三区| 久久精品中文騷妇女内射| 婷婷综合久久中文字幕蜜桃三电影| 亚洲国产成人久久综合野外| 久久99精品久久久久久野外| 久久亚洲高清观看| 久久久久久久尹人综合网亚洲 | 四虎国产永久免费久久| 久久99精品久久只有精品| 亚洲国产精品无码久久久蜜芽| 久久久久久久91精品免费观看| 久久久高清免费视频| 亚洲人成无码www久久久| 亚洲欧洲精品成人久久曰影片| 开心久久婷婷综合中文字幕| 亚洲美日韩Av中文字幕无码久久久妻妇 | 9久久9久久精品| 色综合久久综精品| 久久久久国产|