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

包含目錄、庫目錄、附加包含目錄、附加庫目錄、附加依賴項如何使用? 及靜態庫,動態庫的創建與調用和vs裏引用的使用

pragma 經驗 dll blog res 編譯器 rdquo 編譯期 靜態

https://blog.csdn.net/Young__Fan/article/details/80528740

引言:vs中怎麽添加外部頭文件?

如過直接在項目頭文件處,添加一下,如下圖:

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

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

(1) 直接把外部頭文件復制過來,放在此項目下即與該項目cpp文件同一目錄,如下圖:



(2)項目右鍵,屬性裏的C/C++ - > 常規,附加包含目錄裏添加頭文件的所在目錄路徑



za

或者放在,項目右鍵,屬性裏的VC++目錄 --->包含目錄,包含目錄裏添加頭文件的所在目錄路徑




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

見如下博客:

https://blog.csdn.net/u012043391/article/details/54972127



編譯器在編譯過程中查找包含目錄(Include文件)的順序:

The compiler searches for directories in the following order:

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

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

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


所以從這裏看出,不同的設置有不同的編譯鏈接順序。

參考博客:https://blog.csdn.net/u012234115/article/details/54233095


靜態庫,動態庫的創建與調用

本人的經驗:

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項目裏的函數了。
---------------------
作者:Young__Fan
來源:CSDN
原文:https://blog.csdn.net/Young__Fan/article/details/80528740
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

包含目錄、庫目錄、附加包含目錄、附加庫目錄、附加依賴項如何使用? 及靜態庫,動態庫的創建與調用和vs裏引用的使用