庫的本質:庫從本質上來說是一種可執行**的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。
>兩者的區別:
1. 靜態函式庫
這類庫的名字一般是lib***.a;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標**中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程式必須重新編譯。
2. 動態函式庫
這類庫的名字一般是lib***.so;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,你的程式執行到相關函式時才呼叫該函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態的申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的公升級比較方便。
>為什麼要使用庫?
在編碼過程中有很多可以重用的**,使用庫可以減少我們重複編寫和重複編譯的內容。
>使用方式:
1.關聯靜態庫,(詳細標明靜態庫路徑,./***/***.a編譯即可)
例如: g++ -o main main.cpp -l./lib -ldymamic ./lib/libstatic.a 。 請注意這個靜態庫的路徑。
對於靜態庫,是需要詳細標明這個靜態庫的路徑的, 因為-l後面設定的路徑,對於靜態庫來說是無效的。
2.關聯動態庫,(-l./***/*** 設定動態庫所在的目錄 -l動態庫名 進行編譯。並且執行時要設定環境變數)例如:g++ -o main main.cpp -l./lib -ldymamic -lpthread -lrt 這些是設定到哪個目錄下去查詢關聯的動態庫。
如果在-l目錄下面找不到相應的動態庫,就會到 ld_library_path 的目錄下去找,如果還找不到,就會到/usr/lib 目錄下去找。
另乙個問題,g++ -o main main.cpp -l./lib -ldymamic -lpthread -lrt 編譯成功後, ./main 執行程式會報錯,
提示找不到 libdymamic.so動態庫。 因為使用這種方式,需要額外的設定:export
ld_library_path=$ld_library_path:./lib ,之後執行main就可以正常執行了。
>對於庫的路徑查詢:
靜態庫只在編譯鏈結時搜尋庫所在路徑;
動態庫編譯鏈結和執行時分別查詢路徑,例如前面提到的 -l./lib 是屬於鏈結時期的搜尋路徑,即給ld程式提供的編譯鏈結時候尋找動態庫路徑;而
ld_library_path則既屬於鏈結期搜尋路徑,又屬於執行時期的搜尋路徑。
Linux靜態庫和動態庫區別
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...
Windows靜態庫和動態庫區別
個人建議 能使用靜態庫的就不要使用動態庫,能使用隱式呼叫的就不要用顯示呼叫。注意 1 動態庫中的.lib檔案叫做導入庫,對於導入庫而言,其實際的執行 位於動態庫中,導入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。靜態庫中的.lib叫做靜態庫,本身就包含了實際執行 符號表等等 2 ...
動態鏈結庫 靜態庫 import庫區別
動態鏈結庫 靜態庫 import庫區別 windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll。kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它包含用於執行使用者介面任務 如視窗的建立和訊息的傳送 的各...