1. 程式人生 > >vs中靜態庫與動態庫的呼叫

vs中靜態庫與動態庫的呼叫

解決問題:vs中如何呼叫庫。

1.什麼是庫

庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依賴很多基礎的底層庫

本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。

庫有兩種:靜態庫(.a、.lib)和動態庫(.so、.dll)。

.lib檔案稱作靜態連結庫,.dll檔案稱作動態連結庫。linux系統下對應的檔案為.a檔案及.so檔案。

將一個程式編譯成可執行程式的步驟:

2.動態庫與靜態庫

靜態庫:在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。 

動態庫:在目標檔案執行時載入,手動載入,且對庫有依賴性。 

兩者區別: 
1)靜態庫的使用需要: 
包含一個對應的標頭檔案告知編譯器lib檔案裡面的具體內容;
設定lib檔案允許編譯器去查詢已經編譯好的二進位制程式碼 。

2)動態庫的使用: 
程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫 。

3)依賴性: 
靜態連結表示靜態性,在編譯連結之後, lib庫中需要的資源已經在可執行程式中了, 也就是靜態存在,沒有依賴性了 ;
動態,就是實時性,在執行的時候載入需要的資源,那麼必須在執行的時候提供需要的動態庫,有依賴性, 執行時候沒有找到庫就不能運行了 。

4)區別: 
簡單講,靜態庫就是直接將需要的程式碼連線進可執行程式;動態庫就是在需要呼叫其中的函式時,根據函式對映表找到該函式然後調入堆疊執行。 
做成靜態庫可執行檔案本身比較大,但不必附帶動態庫;
做成動態庫可執行檔案本身比較小,但需要附帶動態庫。

3.如何在vs工程中呼叫編譯好的庫

注意:給其他人鏈接庫的時候,除了.lib檔案還要給出標頭檔案,否則別人將不知道如何呼叫。

當需要使用別人的庫時,需新增.h,.lib,.dll檔案到工程中。可以有兩種方法:a)將.h,.lib,.dll都放在工程目錄下(),需要在使用dll的main函式中載入上標頭檔案,再連結lib(“連結器”->“輸入”->-“附加依賴項”),就可直接使用;b)單獨建立include,bin,lib資料夾,然後將它們連結上;這樣如果要新增的庫比較多時,會更加整齊可讀,推薦採用這種方法。下面介紹這種方法的實現步驟:

1)建立include資料夾,裡面存放.h檔案,然後右擊工程專案,“屬性”->“C/C++”->“常規”->“附加包含目錄”,新增.h路徑即可(為了防止工程遷移,建議新增相對路徑)。

2)建立lib資料夾,裡面存放.lib檔案,然後右擊工程專案,“屬性”->“連結器”->“常規”->“附加庫目錄”,新增.lib路徑即可(為了防止工程遷移,建議新增相對路徑)。

右擊工程專案,“屬性”->“連結器”->“輸入”->“附加依賴項”,新增對應的.lib檔名稱。

3)建立bin資料夾,裡面存放.dll檔案,然後右擊工程專案,“屬性”->“配置屬性”->“除錯”->“工作目錄”,新增.dll路徑即可(為了防止工程遷移,建議新增相對路徑)。

注意事項:

需要關注呼叫的.dll檔案的生成環境,debug,release,x64,win32,注意配置時在相應的環境下配置。