日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
編譯代碼時(shí)動(dòng)態(tài)地鏈接庫

當(dāng)你在編譯代碼時(shí),你通常要處理多個(gè)源文件。開發(fā)人員傾向于將不同的類或模塊放在不同的文件中,這樣它們可以被單獨(dú)維護(hù),甚至可能被不同的項(xiàng)目使用。但當(dāng)你編譯這些文件時(shí),許多文件會(huì)被編譯成一個(gè)可執(zhí)行文件。

為樺南等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及樺南網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、樺南網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

這通常是通過創(chuàng)建共享庫來完成的,然后從可執(zhí)行文件中動(dòng)態(tài)鏈接回它們。這樣可以通過保持模塊化功能的外部性來保持可執(zhí)行文件的小型化,并確保庫可以獨(dú)立于使用它們的應(yīng)用而被更新。

在編譯過程中定位一個(gè)共享對象

當(dāng)你 用 GCC 編譯? 時(shí),你通常需要在你的工作站上安裝一個(gè)庫,以便 GCC 能夠定位到它。默認(rèn)情況下,GCC 假定庫在系統(tǒng)庫路徑中,例如 /lib64? 和 /usr/lib64。然而,如果你要鏈接到一個(gè)你自己的尚未安裝的庫,或者你需要鏈接到一個(gè)沒有安裝在標(biāo)準(zhǔn)位置的庫,那么你必須幫助 GCC 找到這些文件。

有兩個(gè)選項(xiàng)對于在 GCC 中尋找?guī)旌苤匾?/p>

  • -L(大寫字母 L)在 GCC 的搜索位置上增加一個(gè)額外的庫路徑。
  • -l(小寫字母 L)設(shè)置你要鏈接的庫的名字。

例如,假設(shè)你寫了一個(gè)叫做 libexample.so? 的庫,并且你想在編譯你的應(yīng)用 demo.c? 時(shí)使用它。首先,從 demo.c 創(chuàng)建一個(gè)對象文件:

$ gcc -I ./include -c src/demo.c

-I? 選項(xiàng)在 GCC 搜索頭文件的路徑中增加了一個(gè)目錄。在這個(gè)例子中,我假設(shè)自定義頭文件在一個(gè)名為 include? 的本地目錄中。-c 選項(xiàng)防止 GCC 運(yùn)行鏈接器,因?yàn)檫@個(gè)任務(wù)只是為了創(chuàng)建一個(gè)對象文件。結(jié)果如下:

$ ls
demo.o include/ lib/ src/

現(xiàn)在你可以使用 -L 選項(xiàng)為你的庫設(shè)置一個(gè)路徑,然后進(jìn)行編譯:

$ gcc -L`pwd`/lib -o myDemo demo.o -lexample

注意,-L? 選項(xiàng)在 -l? 選項(xiàng)之前。這很重要,因?yàn)槿绻谀愀嬖V GCC 查找非默認(rèn)庫之前沒有將 -L 添加到 GCC 的搜索路徑中,GCC 就不知道要在你的自定義位置上搜索。編譯成功了,但當(dāng)你試圖運(yùn)行它時(shí),卻出現(xiàn)了問題:

$ ./myDemo
./myDemo: error while loading shared libraries:
libexample.so: cannot open shared object file:
No such file or directory

用 ldd 排除故障

ldd 工具可以打印出共享對象的依賴關(guān)系,它在排除類似問題時(shí)很有用:

$ ldd ./myDemo
linux-vdso.so.1 (0x00007ffe151df000)
libexample.so => not found
libc.so.6 => /lib64/libc.so.6 (0x00007f514b60a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f514b839000)

你已經(jīng)知道定位不到 libexample?,但 ldd? 輸出至少確認(rèn)了它對工作庫的期望位置。例如,libc.so.6?已經(jīng)被定位,ldd 顯示其完整路徑。

LD_LIBRARY_PATH

LD_LIBRARY_PATH 環(huán)境變量? 定義了庫的路徑。如果你正在運(yùn)行一個(gè)依賴于沒有安裝到標(biāo)準(zhǔn)目錄的庫的應(yīng)用程,你可以使用 LD_LIBRARY_PATH 添加到系統(tǒng)的庫搜索路徑。

有幾種設(shè)置環(huán)境變量的方法,但最靈活的是在運(yùn)行命令前放置環(huán)境變量??纯丛O(shè)置 LD_LIBRARY_PATH? 對 ldd 命令在分析一個(gè)“損壞”的可執(zhí)行文件時(shí)的作用:

$ LD_LIBRARY_PATH=`pwd`/lib ldd ./
linux-vdso.so.1 (0x00007ffe515bb000)
libexample.so => /tmp/Demo/lib/libexample.so (0x0000...
libc.so.6 => /lib64/libc.so.6 (0x00007eff037ee000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff03a22000)

這也同樣適用于你的自定義命令:

$ LD_LIBRARY_PATH=`pwd`/lib myDemo
hello world!

然而,如果你移動(dòng)庫文件或可執(zhí)行文件,它又會(huì)失效:

$ mv lib/libexample.so ~/.local/lib64
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
./myDemo: error while loading shared libraries...

要修復(fù)它,你必須調(diào)整 LD_LIBRARY_PATH 以匹配庫的新位置:

$ LD_LIBRARY_PATH=~/.local/lib64 myDemo
hello world!

何時(shí)使用 LD_LIBRARY_PATH

在大多數(shù)情況下,LD_LIBRARY_PATH? 不是你需要設(shè)置的變量。按照設(shè)計(jì),庫安裝到 /usr/lib64? 中,因此應(yīng)用自然會(huì)在其中搜索所需的庫。在兩種情況下,你可能需要使用 LD_LIBRARY_PATH:

  • 你正在編譯的軟件需要鏈接到本身剛剛編譯但尚未安裝的庫。良好設(shè)計(jì)的構(gòu)建系統(tǒng),例如Autotools? 和CMake,可以幫助處理這個(gè)問題。
  • 你正在使用設(shè)計(jì)為在單個(gè)目錄之外運(yùn)行的軟件,它沒有安裝腳本,或安裝腳本將庫放置在非標(biāo)準(zhǔn)目錄中。一些應(yīng)用具有 Linux 用戶可以下載、復(fù)制到/opt? 并在“不安裝”的情況下運(yùn)行的版本。LD_PATH_LIBRARY 變量是通過封裝腳本設(shè)置的,因此用戶通常甚至不知道它已被設(shè)置。

編譯軟件為你在運(yùn)行系統(tǒng)方面提供了很大的靈活性。LD_LIBRARY_PATH? 變量以及 -L? 和 -l GCC 選項(xiàng)是這種靈活性的組成部分。


網(wǎng)站標(biāo)題:編譯代碼時(shí)動(dòng)態(tài)地鏈接庫
標(biāo)題網(wǎng)址:http://m.5511xx.com/article/cdpsjjh.html