• <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++博客 首頁 新隨筆 聯系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

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



            linux中動態鏈接庫的搜索順序

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

            雜談

            linux中動態鏈接庫的搜索順序 
            //
            // by kirk,2008.11.21,文中有bug請搞緊與我聯系:-)
            //   
              

                在接手一個很古老的程序時,發現其所使用的動態庫都實在是太陳舊了,正式運行環境中部署的庫都是相適應的,而目前的開發測試環境中均是部署的新的升級版本。為了能在這些環境下開發測試,程序得能在自定義的路徑里來搜索。因此在這里復習一下linux中程序對動態鏈接庫的搜索順序,如下所述:

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

               怎么設置這個選項?

               需要在編譯連接程序的時候使用-Wl,-rpath選項,假設一個程序test需要使用liblib.so庫,如下所示進行編譯連接:

                

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

                 這樣在執行test程序時,test便會先到./即當前目錄下查找所需要的動態庫liblib.so

                2.查找是否存在環境變量 LD_LIBRARY_PATH(它是一個以冒號分隔的庫文件搜索目錄列表)。

               怎么設置這個選項?當然是設置linux下的環境變量就可以了。

            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
             

                  當然,這種方法是對當前登錄生效的。如果想開機即有效,跟其它環境變量的設置也是一樣,需要修改一些配置文件。

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

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

                4.查找默認路徑/lib和/usr/lib,

                如果經過了以上的步驟仍然查找失敗,則將報錯并退出相關程序。

                對于前三個步驟來說,我們均是可以進行設置調整的,其中第三個步驟中的設置需要root權限才能進行,且會影響所有的程序。當使用第一、第二中的方法進行了設置調整后,我們便可以使多種版本的庫共存在同一環境下進行測試,同名也無所謂。
             *********************************************************************

            環境變量LD_LIBRARY_PATH用來指定查找共享庫時除了默認路徑之外的其他路徑。(該路徑在默認路徑之前查找)
            移植程序時的經常碰到需要使用一些特定的動態庫,而這些編譯好的動態庫放在我們自己建立的目錄里,這時我們可以設置LD_LIBRARY_PATH。
            例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/
            這樣就可以使用/work/lib/下的庫文件了,運行程序后系統會自動到環境變量LD_LIBRARY_PATH指定的路徑中查找其所需的庫。
            系統查找動態庫的順序
            系統先找LD_LIBRARY_PATH下的庫再找/lib and /usr/lib等路徑下的庫,還有/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啟動之后就加載LD_LIBRARY_PATH的路徑
            /etc/rc.d/rc.local文件中加入export   LD_LIBRARY_PATH="xxxxx"  即可
            如果在鏈接時使用了"-R"和"-L"選項,則相關動態庫的路徑將保存在ELF文件中,于
            是以后的運行中不再需要設置環境變量去定位動態庫。比如,有一個
            /usr/local/lib/libfoo.so,而你的bar程序需要這個libfoo.so,編譯、鏈接時最好
            這樣 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo
            (#man gcc ,沒發現-R或-rpath選項,待查)


            posted on 2015-08-18 17:42 Enic 閱讀(1125) 評論(0)  編輯 收藏 引用 所屬分類: linux
            国产福利电影一区二区三区久久久久成人精品综合| 精品久久久久久国产三级| 久久这里只精品99re66| 久久久久一本毛久久久| 亚洲国产日韩欧美久久| 久久国产欧美日韩精品免费| 精品久久人妻av中文字幕| 久久精品国产亚洲AV高清热 | 国产精品久久精品| 欧美午夜精品久久久久免费视 | 久久久国产99久久国产一| 精品一区二区久久| 久久天天躁狠狠躁夜夜2020| 狠狠综合久久AV一区二区三区| 7777久久久国产精品消防器材| 久久久久99精品成人片试看| 国产真实乱对白精彩久久| 中文字幕无码精品亚洲资源网久久| a级成人毛片久久| 久久国产三级无码一区二区| 久久久久久久久久久精品尤物| 99久久精品午夜一区二区| 午夜视频久久久久一区 | 无码专区久久综合久中文字幕 | 99热精品久久只有精品| 久久久久久精品免费免费自慰 | 久久综合九色欧美综合狠狠| 久久中文骚妇内射| 人人狠狠综合久久亚洲| 久久国产乱子伦精品免费强| 欧美日韩久久中文字幕| 国产成人精品综合久久久| 久久久久久久人妻无码中文字幕爆| 久久久久九九精品影院| 亚洲国产天堂久久综合网站| 久久久久亚洲AV无码网站| 人人妻久久人人澡人人爽人人精品 | 久久精品成人免费看| 久久国产免费直播| 香蕉99久久国产综合精品宅男自| 久久久九九有精品国产|