1. 程式人生 > >包含目錄、庫目錄、附加包含目錄、附加庫目錄、附加依賴項如何使用? 及靜態庫,動態庫的建立與呼叫和vs裡引用的使用

包含目錄、庫目錄、附加包含目錄、附加庫目錄、附加依賴項如何使用? 及靜態庫,動態庫的建立與呼叫和vs裡引用的使用

引言:vs中怎麼新增外部標頭檔案?

如過直接在專案標頭檔案處,新增一下,如下圖:


則,依然會報錯,如下圖:


有兩種方法,來解決(你不在vs上的新增它也沒事):

(1) 直接把外部標頭檔案複製過來,放在此專案下即與該專案cpp檔案同一目錄,如下圖:


(2)專案右鍵,屬性裡的C/C++   - > 常規,附加包含目錄裡新增標頭檔案的所在目錄路徑


za

或者放在,專案右鍵,屬性裡的VC++目錄 --->包含目錄,包含目錄裡新增標頭檔案的所在目錄路徑


vs中包含目錄、庫目錄、附加包含目錄、附加庫目錄、附加依賴項如何正確使用?

見如下部落格:

 編譯器在編譯過程中查詢包含目錄(Include檔案)的順序:

The compiler searches for directories in the following order:

  1. Directories containing the source file.
  2. Directories specified with the /I option, in the order that CL encounters them.
  3. Directories specified in the INCLUDE environment variable.

其中step2中的/I是由C/C++ -> General -> Additional Include Directories設定的。 

而step3中的INCLUDE是由VC++ Directories -> Include Directories設定的。 

所以從這裡看出,不同的設定有不同的編譯連結順序。

靜態庫,動態庫的建立與呼叫

本人的經驗:

    1.不附加與附加的目錄或庫,用哪個可以。

    2.呼叫靜態庫、動態庫

    (1)呼叫靜態連結庫

        使用靜態連結庫時(如呼叫裡面的函式),首先要把靜態連結庫的標頭檔案包含在專案的裡(即寫#include "xxxx.h")。

        方法一:複製標頭檔案及lib檔案到該專案下,然後在屬性-連結器-輸入-附加依賴項里加入xxx.lib。

        方法二:(附加)包含目錄,就是指定lib的h檔案路徑,然後在屬性-連結器-輸入-附加依賴項里加入xxx.lib。

        方法三:在程式碼中,新增 #pragma comment(lib, "XXX.lib") 並且填加相應的xxx.h標頭檔案。


     (2).呼叫動態連結庫

          靜態呼叫:

首先首先要把庫用到的標頭檔案包含在專案的裡(即寫#include "xxxx.h")。

         方法一:複製h檔案,lib檔案和dll檔案到該專案下(即專案的cpp檔案同目錄下)。,或者將dll放在exe檔案的同文件夾裡,然後在屬性裡的附件依賴項里加入xxx.lib。

        方式二:(附加)包含目錄,就是指定lib的h檔案路徑,再將xxx.dll複製到你的項裡(即專案裡有cpp檔案的那個目錄),或者將dll放在exe檔案的同文件夾裡,然後在屬性裡的附件依賴項里加入xxx.lib。

        我發現在Qt專案裡,只能使用附加包含目錄和附件庫目錄,才有效

       動態呼叫見下面的參考部落格

h標頭檔案 .lib庫檔案 .dll動態連結庫檔案關係

  • .h標頭檔案是編譯時必須的,lib是連結時需要的,dll是執行時需要的。
    附加依賴項新增的是.lib而不是.dll,若生成了DLL,則肯定也生成了LIB檔案。
  • H檔案的作用:宣告函式介面
  • DLL檔案作用:函式可執行程式碼
  • LIB檔案作用:當我們在自己的程式中引用了一個H檔案裡的函式,連結器怎麼知道該呼叫哪個DLL檔案呢?這就是LIB檔案的作用了。它告訴連結器呼叫的函式在哪個DLL中,函式執行程式碼在DLL中的什麼位置,這也就是為什麼需要附加依賴項.LIB檔案,它起到橋樑的作用。
  • 如果是生成靜態庫檔案,則沒有DLL,只有lib,這時函式可執行程式碼部分也在lib檔案中。

再說一點

目前以lib字尾的庫有兩種,一種為靜態連結庫(Static Libary,以下簡稱“靜態庫”),另一種為動態連線庫(DLL,以下簡稱“動態庫”)的匯入庫(Import Libary,以下簡稱“匯入庫”)。

    靜態庫是一個或者多個obj檔案的打包,所以有人乾脆把從obj檔案生成lib的過程稱為Archive,即合併到一起。比如你連結一個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。動態庫一般會有對應的匯入庫,方便程式靜態載入動態連結庫,否則你可能就需要自己LoadLibary調入DLL檔案,然後再手工GetProcAddress獲得對應函數了。有了匯入庫,你只需要連結匯入庫後按照標頭檔案函式介面的宣告呼叫函式就可以了。匯入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行程式碼、符號表等等,而對於匯入庫而言,其實際的執行程式碼位於動態庫中,匯入庫只包含了地址符號表等,確保程式找到對應函式的一些基本地址資訊。

    一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。

參考部落格:https://www.cnblogs.com/zqh20145320/p/6772985.html

vs中引用的用法:

我們在開發過程中,經常會使用別人的庫,即靜態連結庫lib或動態連結庫


在引用裡引用建立為lib或dll的專案,然後再在該專案屬性-包含目錄裡包含標頭檔案路徑(或者把標頭檔案都複製到你的專案cpp檔案所在檔案裡)


此時不用再像前文那樣設定庫目錄了與附加依賴項了,就可以直接在專案cpp檔案裡包含標頭檔案(即寫#include "xxxx.h"),直接呼叫lib或dll專案裡的函數了。