要學會用man,特別是man2(系統調用)和man3(C函數庫),比如:
mansqrt
會顯示需要引用的頭文件,專編譯時需要的動態鏈接庫
如果屬重復,則需要指定手冊章節,比如
manwrite顯示的是write程序幫助,如果想看系統調用,則要輸入man2wirte
另外,/lib64:/lib:/usr/lib64:/usr/lib這些是系統預設的,不用指定
Ⅱ 面試 | Linux 下的動態鏈接庫問題
在 Linux 開發時,我們經常會看到一些形如 xxx.so 的名稱出現,其中 so 是 Shared Object 的縮寫,即可以共享的目標文件,也就是我們所稱為的動態鏈接庫,和在 Windows 下大家玩 游戲 時遇到的 xxx.dll 錯誤中的文件是一個類型的。
面試中經常會問到以下問題:
庫是寫好的現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。
庫有兩種:
在一個程序的編譯過程中,分為以下幾個步驟: 預處理 , 編譯 , 匯編 , 鏈接 。本文中討論的鏈接庫就是針對最後一個步驟「鏈接」而言的。
動態庫和靜態庫的區別
左圖為靜態鏈接庫,右圖為動態鏈接庫
對於靜態鏈接庫而言在鏈接階段,會將匯編生成的「目標文件.o」與引用到的庫一起鏈接打包到可執行文件中。因此對應的鏈接方式稱為靜態鏈接:
靜態鏈接可以理解為最後生成了一個「單文件免安裝綠色版」的程序,優點在於移植的時候只需要移動這一個文件,缺點在於文件體積非常大,為了解決這樣的問題,就有了動態鏈接庫。動態鏈接庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行時才被載入。
動態庫連接到系統空間,如果多個程序連接了同一個庫,那麼只需要一份,優點在於編譯程序的時候不會將對應的庫文件全部打包在生成的程序中,而是保留了到對應庫的鏈接,缺點就是移植的時候如果只移動了對應的程序沒有安裝相關的庫的話,就會看到類似以下喜聞樂見的結果了。
在 Linux 下一個動態庫有y三個不同名字的文件組成:
當程序在內部列出所需要的鏈接庫時,僅僅使用 soname。當你創建一個鏈接庫時,使用 real name。安裝一個新的鏈接庫時,把它復制到一個DLL文件夾里,然後運行程序 ldconfig。ldconfig 檢查存在的 real name 文件,並且創建指向它符號鏈接 soname 文件。可能大家比較常見到的有 libsodium 等。
有了上面關於庫的一些基礎知識之後,我們可以開始嘗試創建一個動態庫來供程序使用了。
比如我們有一個求最大值的函數 max(int a,int b,int c) ,放在文件 max.c 中文件內容如下:
可以通過:
將其編譯為共享庫,-fPIC是編譯選項,PIC是 Position Independent Code 的縮寫,表示要生成位置無關的代碼,這是動態庫需要的特性; -shared是鏈接選項,告訴 gcc 生成動態庫而不是可執行文件。為了讓用戶知道我們的動態庫中有哪些介面可用,我們需要編寫對應的頭文件,比如可以寫一個 max.h :
設置一個驅動函數來測試我們編寫的動態庫:
通過 gcc test.c -L. -lmax來生成 a.out,其中-lmax表示要鏈接 libmax.so,-L.表示搜索要鏈接的庫文件時包含當前路徑。
但是這樣直接運行的話,會出現一個錯誤:
由於 Linux 是通過/etc/ld.so.cache文件搜尋要鏈接的動態庫的,而 /etc/ld.so.cache 是 ldconfig 程序讀取 /etc/ld.so.conf 文件生成的,本次使用的動態庫 libmax.so 並不在對應的目錄下,就會導致程序無法找到對應的動態鏈接庫,這樣我們的解決方法有二:
小結
動態鏈接庫是各個系統中的一個重要的組成部分且在 Linux 開發相關領域中尤為重要,也是一個面試的高頻考點,除了動態鏈接庫以外,還有以下相關知識也是高頻考點,在面試前一定要准備好:
本文作者:Nova Kwok
Ⅲ linux的動態庫.so文件放下哪裡
這個一般沒有要求。一般/lib /usr/lib
其它的要看具體情況。。。
如果你是自己編譯的應用程序,.so文件一般就在安裝目錄下的lib目錄中。
Ⅳ 用arm-linux交叉編譯器使用動態庫時搜索標准路徑是什麼
/usr/lib , /橘源usr/libxx xx為數字,一般32或64,x32
標准頭好伍畢文友芹件搜索路徑:/usr/include/
Ⅳ (linux)動態鏈接庫找不到路徑
ld.so.conf只是在編譯時查找動態庫的路徑;
運行時動態庫的查找路徑默認在/usr/lib和/lib,所以找不到
可以設置LD_LIBRARY_PATH=/usr/local/ma(你動態庫的所在目錄)
或者把動態庫拷貝到/usr/lib或/lib下
Ⅵ 如何讓linux載入當前目錄的動態庫
linux 載入當前目錄的動態庫的方法是:設置合適的環境變數LD_LIBRARY_PATH。x0dx0a設置方法有以下三種:x0dx0ax0dx0a1、臨時修改,log out之後就失效x0dx0a在terminal中執行:export LD_LIBRARY_PATH=./x0dx0ax0dx0a2、讓當前帳號以後都優先載入當前目錄的動態庫x0dx0a修改~/.bash_profile在文件末尾加上兩塵或殲行:派沖 LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH x0dx0ax0dx0a3、讓所有帳號從此都團粗優先載入當前目錄的動態庫x0dx0a修改/etc/profile在文件末尾加上兩行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
Ⅶ Linux系統的庫文件一般放在( )目錄下
D
Linux的庫一般在/lib或/usr/lib目錄下。lib是庫(Library)的英文縮寫,它主要存放系統的鏈接庫專文件,沒有該目錄則系統就無屬法正常運行。/lib目錄中存儲著程序運行時使用的共享庫。通過共享庫,許多程序可以重復使用相同的代碼,並且這些庫可以存儲在一個公共的位置上,因此能減小運行程序的大小。這個目錄包含程序在鏈接時使用的各種庫。
Ⅷ linux 編譯是怎麼添加動態庫的路徑
最簡單配置就是把連接庫目錄,添加到/etc/ld.so.conf中,一行一個目激或錄就行,添加激鉛租完成後,執行#ldconfig更新動明兆態連接庫。
Ⅸ linux怎麼配置庫目錄附加依賴項
一、添加附加包含目錄
法1:-I path(path為頭文件路徑)
啟模脊 法2:將頭文件拷貝到 /usr/local/碼明include中
相當於VS中添加包含路徑。
二、添加依賴庫
法1,編譯階段,g++編譯器編譯:
-L path –lcaffe(path為附加庫目錄路徑;-l指定附加依賴項,比如-lcaffe表示附加libcaffe.so動悄滲態庫文件)。
執行階段,在工作目錄或環境變數中搜索dll文件:
添加環境變數:
2.1 /etc/ld.so.conf 文件中方法:
添加庫目錄,使其成為共享庫:
2.1.1、 打開文件:sudo gedit /etc/ld.so.conf
2.1.2、在文件中添加路徑(如libnnpack.so的路徑)
2.1.2、使其生效:sudo ldconfig
2.2 export方法,參考:http://blog.csdn.net/xzzppp/article/details/53305120
VS中添加附加庫目錄路徑和附加依賴項,分別如下圖所示:
法2,在編譯階段直接指定: path/libcaffe.so(path為附加庫目錄路徑,libcaffe.so為動態庫,在執行階段可以直接運行)
法3,, Linux動態庫的默認搜索路徑是/lib和/usr/lib,將動態庫拷貝到這兩個文件夾下面。