VS_C++編程學(xué)習(xí)(二)超詳細(xì)的OpenCV庫配置
自用,前面是一些補(bǔ)充,要快速配置直接跳到第四節(jié);
一、打開項(xiàng)目
【點(diǎn)擊需要運(yùn)行/查看的項(xiàng)目的*.sln文件】==>相當(dāng)于【打開該項(xiàng)目】,右鍵打開文件夾不行

二、注釋快捷鍵
1. 工具->選項(xiàng) 打開選項(xiàng)窗口,在左側(cè)導(dǎo)航欄中定位到 環(huán)境->鍵盤 即可在右側(cè)查看到注釋相關(guān)內(nèi)容,在“顯示命令包含”下面輸入關(guān)鍵字進(jìn)行過濾,例如輸入“注釋”即可過濾出注釋相關(guān)的內(nèi)容:

2.修改快捷鍵則將光標(biāo)定位到“按快捷鍵”下面的輸入框中,然后在鍵盤上鍵入自定義的快捷鍵組合,再依次點(diǎn)擊 分配->確定 即可。
3.自定義快捷鍵需要注意并不能定義一個(gè)已有的快捷鍵組合,否則會(huì)導(dǎo)致快捷鍵沖突無法使用,因此需要把其他用到Ctrl + /的功能移除掉
三、配置項(xiàng)解析
參考:
https://blog.csdn.net/zeye5731/article/details/125898439?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-125898439-blog-105249804.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-125898439-blog-105249804.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=11
“利用Visual Studio編寫C++工程文件時(shí),時(shí)常需要自行配置自己編寫的頭文件、外部引用的靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫的路徑,這時(shí)候需要在項(xiàng)目屬性中進(jìn)行配置。本文主要介紹包含目錄、庫目錄、附加依賴項(xiàng)、附加包含目錄、附加庫目錄配置與靜態(tài)庫、動(dòng)態(tài)庫的調(diào)用?!?/p>
右鍵屬性:
3.1? 包含目錄、附加包含目錄
1.包含目錄是.h的頭文件所在的目錄,如果沒有正確包含目錄,代碼中會(huì)出現(xiàn)紅色的警告,各種未定義的標(biāo)識(shí)符。
2.外部包含目錄的屬性,可以用來定義外部頭文件所在的目錄位置,外部頭文件設(shè)置不同的警告級(jí)別和其他代碼分析級(jí)別。這個(gè)功能屬于附加的功能一般不管。

3.附加包含目錄:一般指頭文件目錄,建議項(xiàng)目引用的其他庫的頭文件目錄在這里配置,而不是在vc++目錄–>包含目錄。

編譯器搜索頭文件順序:
如果#include使用雙引號(hào)(“”)形式,它將首先搜索本地目錄?,F(xiàn)從包含#include語句的當(dāng)前文件的所在目錄開始搜索。若果失敗,則從當(dāng)前目錄的父目并逐級(jí)往上搜索,直到最上層include文件所在的目錄。
如果#include使用尖括號(hào)(<>)形式,或者使用雙引號(hào)形式本地目錄檢索失敗,它會(huì)按照/I選項(xiàng)(附加包含目錄)指定的目錄搜索。順序是按照CL在命令行中遇到它們的順序。
INCLUDE環(huán)境變量指定的目錄,即包含目錄。
所以,對(duì)本項(xiàng)目自身的#include一定要用雙引號(hào)(“”),否則如果用尖括號(hào)<>,不會(huì)搜索本地目錄,而是直接從 附加包含目錄 開始搜索,自然就找不到本地的文件,然后報(bào)錯(cuò)。
3.2 庫目錄、附加庫目錄
作用:指明庫文件所在的目錄or路徑,即尋找.lib文件的搜索目錄
區(qū)別:優(yōu)先級(jí)不同,先檢索附加庫目錄,再檢索庫目錄
庫目錄:一般指靜態(tài)包lib,類似于linux下的/usr/lib。
附加庫目錄:引用的靜態(tài)庫的目錄,一般引用其他庫文件時(shí)推薦在這里配置,而非vc++目錄–>庫目錄。


3.3 附加依賴項(xiàng)
附加依賴項(xiàng):即要引用的庫的名稱,引用的庫必須在附加庫目錄下。附加依賴項(xiàng)等同于在源碼中寫#pragma(lib,"xxx.lib")
,所以,不要重復(fù)配置。
作用:指明依賴庫文件的名稱

3.4 靜態(tài)鏈接庫調(diào)用方法
1.使用一個(gè)靜態(tài)庫,除了要include其頭文件以外(附加包含目錄),還要在鏈接過程中把lib加進(jìn)去(附加庫目錄、附加依賴項(xiàng))。
2.附加包含目錄、附加庫目錄、附加依賴項(xiàng)的添加方法及說明:
① 附加包含目錄—添加工程的頭文件目錄:
項(xiàng)目->屬性->配置屬性->C/C+±>常規(guī)->附加包含目錄:加上頭文件的存放目錄;
② 附加庫目錄—添加文件引用的lib靜態(tài)庫路徑:
項(xiàng)目->屬性->配置屬性->鏈接器->常規(guī)->附加庫目錄:加上lib文件的存放目錄;
③ 附加依賴項(xiàng)—添加工程引用的lib文件名:
項(xiàng)目->屬性->配置屬性->鏈接器->輸入->附加依賴項(xiàng):加上lib文件名。
3.5 動(dòng)態(tài)鏈接庫的調(diào)用方法
1.包含靜態(tài)鏈接庫的操作
① 附加包含目錄—添加工程的頭文件目錄:
項(xiàng)目->屬性->配置屬性->C/C+±>常規(guī)->附加包含目錄:加上頭文件的存放目錄;
② 附加庫目錄—添加文件引用的lib靜態(tài)庫路徑:
項(xiàng)目->屬性->配置屬性->鏈接器->常規(guī)->附加庫目錄:加上lib文件的存放目錄;
③ 附加依賴項(xiàng)—添加工程引用的lib文件名:
項(xiàng)目->屬性->配置屬性->鏈接器->輸入->附加依賴項(xiàng):加上lib文件名。
2.當(dāng)需要向項(xiàng)目中添加.dll動(dòng)態(tài)鏈接庫時(shí),直接將需要添加的.dll文件拖拽到項(xiàng)目生成的.exe所在的文件夾下即可(項(xiàng)目->屬性->配置屬性->常規(guī)->輸出目錄,可以看到.exe生成在哪個(gè)目錄下)。
3.6 動(dòng)態(tài)鏈接和靜態(tài)鏈接、lib和dll文件
3.6.1 動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫
靜態(tài)鏈接庫:當(dāng)要使用時(shí),連接器會(huì)找出程序所需的函數(shù),然后將它們拷貝到執(zhí)行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態(tài)程序庫也就不再需要了。
動(dòng)態(tài)庫而言:某個(gè)程序在運(yùn)行中要調(diào)用某個(gè)動(dòng)態(tài)鏈接庫函數(shù)的時(shí)候,操作系統(tǒng)首先會(huì)查看所有正在運(yùn)行的程序,看在內(nèi)存里是否已有此庫函數(shù)的拷貝了。如果有,則讓其共享那一個(gè)拷貝;只有沒有才鏈接載入。在程序運(yùn)行的時(shí)候,被調(diào)用的動(dòng)態(tài)鏈接庫函數(shù)被安置在內(nèi)存的某個(gè)地方,所有調(diào)用它的程序?qū)⒅赶蜻@個(gè)代碼段。因此,這些代碼必須使用相對(duì)地址,而不是絕對(duì)地址。在編譯的時(shí)候,我們需要告訴編譯器,這些對(duì)象文件是用來做動(dòng)態(tài)鏈接庫的,所以要用地址無關(guān)代碼(Position Independent Code (PIC))。
3.6.2?lib和dll文件
(1)lib是編譯時(shí)需要的,dll是運(yùn)行時(shí)需要的。
如果要完成源代碼的編譯,有l(wèi)ib就夠了。
如果也使動(dòng)態(tài)連接的程序運(yùn)行起來,有dll就夠了。
在開發(fā)和調(diào)試階段,當(dāng)然最好都有。
(2)一般的動(dòng)態(tài)庫程序有l(wèi)ib文件和dll文件。
lib文件是必須在編譯期就連接到應(yīng)用程序中的,而dll文件是運(yùn)行期才會(huì)被調(diào)用的。如果有dll文件,那么對(duì)應(yīng)的lib文件一般是一些索引信息,具體的實(shí)現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個(gè)lib文件是靜態(tài)編譯出來的,索引和實(shí)現(xiàn)都在其中。靜態(tài)編譯的lib文件有好處:給用戶安裝時(shí)就不需要再掛動(dòng)態(tài)庫了。但也有缺點(diǎn),就是導(dǎo)致應(yīng)用程序比較大,而且失去了動(dòng)態(tài)庫的靈活性,在版本升級(jí)時(shí),同時(shí)要發(fā)布新的應(yīng)用程序才行。
(3)在動(dòng)態(tài)庫的情況下,有兩個(gè)文件,一個(gè)是引入庫(.LIB)文件,一個(gè)是DLL文件。
引入庫文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個(gè)或多個(gè)應(yīng)用程序運(yùn)行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)?huì)產(chǎn)生錯(cuò)誤。
四、OpenCV庫的調(diào)用
https://www.bilibili.com/read/cv18295846,之前配置過opencv的環(huán)境,下載鏈接在里面

4.1?opencv目錄結(jié)構(gòu)
4.1.1?opencv的頭文件(包含)目錄
C:\opencv\build\include

4.1.2 opencv的庫目錄和庫文件(依賴項(xiàng))
opencv的庫文件在build的x64文件夾里

vs2019用v15的庫文件可以

lib庫的具體依賴項(xiàng)
常用d后綴的lib庫,配合調(diào)試的debug的x64模式

編譯器注意修改

4.2?opencv庫導(dǎo)入
1.附加包含目錄在C/C++?的常規(guī)項(xiàng)中配置
C:\opencv\build\include

2.附加庫目錄在鏈接器的常規(guī)
C:\opencv\build\x64\vc15\lib

3.附加依賴項(xiàng)在鏈接器的輸入項(xiàng)
opencv_world341d.lib

測(cè)試:
#include<iostream>
#include<openCV2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("mm.jpg");
namedWindow("mm.jpg");
imshow("mm.jpg", img);
waitKey(6000);
return 0;
}
五、OpenCV庫配置導(dǎo)出為項(xiàng)目模板
1.項(xiàng)目-導(dǎo)出為模板

2.項(xiàng)目模板改名

3.導(dǎo)出的模板文件

4.下一次不用在配置opencv了
