前言
最近因?yàn)轫?xiàng)目需求,需要在 Windows 下開(kāi)發(fā)一個(gè) C++ 項(xiàng)目,博主之前都是在 Linux 上開(kāi)發(fā)的,突然轉(zhuǎn)到 Windows 多少還是有點(diǎn)不適應(yīng)的。本次使用的 IDE 是 Visual Studio,之前有簡(jiǎn)單使用過(guò),但是很多都忘記了,故此做個(gè)記錄,方便下次查看。
本文主要針對(duì) Visual Studio 2017 的安裝和項(xiàng)目配置進(jìn)行簡(jiǎn)單的分享,若有問(wèn)題歡迎各位看官批評(píng)指正?。。??
1. What、Why and How
1.1 What
Visual Studio 是什么?
Visual Studio(簡(jiǎn)稱 VS)是美國(guó)微軟公司的開(kāi)發(fā)工具包系列產(chǎn)品,是一個(gè)集成的開(kāi)發(fā)環(huán)境,相對(duì)來(lái)說(shuō)比較完整,它包括了整個(gè)軟件生命周期中所需要的大部分工具,如代碼完成工具、編譯器、圖形設(shè)計(jì)器、UML工具、代碼管控工具、集成開(kāi)發(fā)環(huán)境(IDE)等等,以簡(jiǎn)化開(kāi)發(fā)人員構(gòu)建應(yīng)用程序的過(guò)程。通俗的講,是一款編譯器。
要注意的是,它雖然和 Visual Studio Code 名字非常相近,但兩者完全不是同一個(gè)東西?。。?/p>
Visual Studio Code (簡(jiǎn)稱 VSCode)是美國(guó)微軟公司開(kāi)發(fā)的一個(gè)項(xiàng)目,是一款現(xiàn)代化開(kāi)源的、免費(fèi)的、跨平臺(tái)的、高性能的、輕量級(jí)的代碼編輯器。通俗地講,它是一款超級(jí)的文本編輯器。
參考自:Visual Studio和Visual Studio Code(VSCode)的區(qū)別及如何選擇
1.2 Why
為什么要學(xué)習(xí)安裝和配置 Visual Studio?
為了項(xiàng)目需求,需要在 Windows 下面開(kāi)發(fā) C++ 項(xiàng)目
1.3 How
怎么去安裝和配置 Visual Studio?
博主主要參考:VisualStudio2017下載與安裝教程詳解
2. 安裝
軟件:Visual Studio 2017 Community
官網(wǎng)下載地址:https://visualstudio.microsoft.com/zh-hansda/vs/older-downloads/
網(wǎng)盤(pán)下載:Baidu Driver【pwd:1234】注:博主安裝的 Visual Studio 2017 版本屬于老版本了,大家務(wù)必根據(jù)自己的實(shí)際情況選擇,另外每個(gè)版本提供三種選擇:Community(社區(qū)版,對(duì)學(xué)生、開(kāi)源貢獻(xiàn)者和個(gè)人免費(fèi))、Professional(專(zhuān)業(yè)版,適合小型團(tuán)隊(duì))、Enterprise(企業(yè)版,適用于任何規(guī)模的團(tuán)隊(duì))
1. 鼠標(biāo)點(diǎn)擊【Visual Studio2017(64bit)】壓縮包解壓
2. 雙擊打開(kāi)解壓后的文件夾,鼠標(biāo)點(diǎn)擊【vs2017】選擇【以管理員身份運(yùn)行】
3. 點(diǎn)擊繼續(xù)
4. 軟件下載及安裝中(請(qǐng)保持電腦連接網(wǎng)絡(luò))
5. 勾選【使用 C++ 的桌面開(kāi)發(fā)】(根據(jù)自己的需求勾選,博主自身只需要做 C++ 開(kāi)發(fā),右邊是該選項(xiàng)的插件根據(jù)自己的需求選擇安裝,博主未做修改)
6. 點(diǎn)擊【單個(gè)組件】欄,如果有不想安裝的插件或者想安裝的插件,分別是取消勾選和勾選即可(博主未做修改)
7. 點(diǎn)擊【語(yǔ)言包】欄,一般選擇默認(rèn)即可,默認(rèn)一般為【中文】
8. 點(diǎn)擊【安裝位置】(點(diǎn)擊"…"可更改軟件安裝位置,建議不要安裝在C盤(pán),可以在D盤(pán)或其它磁盤(pán)下新建一個(gè) “vs2017” 文件夾。注:安裝路徑中不能有中文),取消勾選【安裝完成后保留下載緩存】,在右下角點(diǎn)擊【安裝】。
9. 下載安裝中
10. 安裝完成,點(diǎn)擊右上角【X】退出
11. 點(diǎn)擊【以后再說(shuō)】
12. 選擇自己喜歡的顏色主題,點(diǎn)擊【啟動(dòng) Visual Studio】
13. 創(chuàng)建桌面啟動(dòng)快捷方式方法:點(diǎn)擊桌面左下角【開(kāi)始】圖標(biāo),點(diǎn)擊【所有應(yīng)用】 → \rightarrow → 找到并拖動(dòng)【Visual Studio 2017】圖標(biāo)到電腦桌面
至此,Visual Studio 2017 安裝成功,接下來(lái)我們來(lái)看下如何使用 Visual Studio 進(jìn)行項(xiàng)目開(kāi)發(fā)。
3. 創(chuàng)建新項(xiàng)目
目的:利用 Visual Studio 2017 創(chuàng)建一個(gè)新項(xiàng)目,輸出 “Hello World”
1. 點(diǎn)擊桌面上的 Visual Studio 2017 快捷方式,然后點(diǎn)擊【新建項(xiàng)目】下面的【創(chuàng)建新項(xiàng)目】
2. 點(diǎn)擊【空項(xiàng)目】,項(xiàng)目名稱和項(xiàng)目存放位置可自行修改,點(diǎn)擊確定
OK!創(chuàng)建完了新項(xiàng)目我們先不著急寫(xiě)程序,先分析一下整個(gè)界面,
首先最上面就是我們的菜單欄,然后右邊是我們的解決方案資源管理器,它是 Visual Studio 集成開(kāi)發(fā)環(huán)境(IDE)中的一個(gè)面板,它用于顯示和管理項(xiàng)目和解決方案中的文件、文件夾、引用等各種資源,我們就在這里添加我們的 C++ 文件,右下角就是關(guān)于項(xiàng)目的一些屬性,比如項(xiàng)目文件的路徑、根命名空間等
現(xiàn)在說(shuō)明下 Visual Studio 解決方案中的各個(gè)部分含義:(from chatGPT)
-
引用(References):在這個(gè)部分,你可以添加對(duì)其他項(xiàng)目或外部庫(kù)的引用。這些引用可以是項(xiàng)目?jī)?nèi)的其他項(xiàng)目,也可以是外部的庫(kù),它們可以是編譯時(shí)鏈接的依賴項(xiàng)。
-
外部依賴項(xiàng)(External Dependencies):這個(gè)部分列出了項(xiàng)目所依賴的外部庫(kù)或其他項(xiàng)目。你可以在這里設(shè)置如何查找和鏈接這些依賴項(xiàng),以確保項(xiàng)目能夠正確地編譯和運(yùn)行。
-
頭文件(Header Files):這里包含了項(xiàng)目中的頭文件(.h 或 .hpp 文件),這些頭文件通常包含了類(lèi)、函數(shù)和變量的聲明。頭文件的內(nèi)容可以被多個(gè)源文件共享,因此它們通常包含接口定義。
-
源文件(Source Files):這個(gè)部分包含項(xiàng)目中的源代碼文件(.cpp 文件)。這些文件包含了實(shí)際的類(lèi)實(shí)現(xiàn)、函數(shù)定義等。
-
資源文件(Resource Files):這里包含項(xiàng)目所需的資源文件,如圖標(biāo)、位圖、字符串等。這些資源文件可以用于項(xiàng)目的用戶界面和其他功能。
然后整個(gè)界面中還有兩個(gè)地方值得我們重點(diǎn)關(guān)注,一個(gè)是編譯模式選擇,另外一個(gè)是編譯平臺(tái)選擇,下面我們就具體說(shuō)下該如何選擇
Copy自:Visual Studio中Debug與Release以及x86、x64、Any CPU的區(qū)別
關(guān)于編譯模式,在 Visual Studio 中編譯模式有 2 種:Debug 與 Release。這也是默認(rèn)的兩種方式,在新建一個(gè)項(xiàng)目的時(shí)候,就已經(jīng)存在這兩種模式供選擇。
Debug 通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序
Release 通常稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的,以便用戶很好地使用。
這點(diǎn)類(lèi)似于 GCC 編譯器中的 -g、-O 選項(xiàng),在開(kāi)發(fā)階段我們會(huì)啟動(dòng) -g -O0 選項(xiàng)以方便調(diào)試,而在發(fā)布生產(chǎn)環(huán)境時(shí)會(huì)啟動(dòng) -O3 選項(xiàng)進(jìn)行優(yōu)化
一般都是用 Release 來(lái)打包發(fā)布程序,因?yàn)?Release 做了更多的優(yōu)化,運(yùn)行速度更快,適合在項(xiàng)目完成后部署,另外,Release 打包出來(lái)的程序文件也相對(duì)來(lái)說(shuō)會(huì)小一些。而 Debug 模式更適合在開(kāi)發(fā)調(diào)試的時(shí)候使用。即:開(kāi)發(fā)調(diào)試的時(shí)候使用 Debug 模式,打包發(fā)布程序用 Release 模式。
關(guān)于編譯平臺(tái),它們之間最直接的區(qū)別就是:x86 平臺(tái)編譯出來(lái)的 .exe(可執(zhí)行文件)或者 .dll(動(dòng)態(tài)鏈接庫(kù))都是 32 位的,x64 平臺(tái)編譯的則是 64 位的
如果你的項(xiàng)目主程序(編譯出來(lái)是 .exe 文件的)是 x86 平臺(tái)下編譯的,而它所依賴的一個(gè)項(xiàng)目(或動(dòng)態(tài)鏈接庫(kù))是 x64 位平臺(tái)編譯出來(lái)的,則會(huì)提示 “未能加載文件或程序集…或它的某一個(gè)依賴性,試圖加載格式不正確的程序” 之類(lèi)的錯(cuò)誤。這是因?yàn)?32 位程序不能加載 64 位的 dll,更不能調(diào)用其中的類(lèi)、方法和對(duì)象等。
反之,若主程序是由 x64 平臺(tái)編譯出來(lái)的,而 dll 是 x86 的也是不行的!
因此,基本可以確定一點(diǎn):dll 和主程序的生成平臺(tái)只要一致就可以
那怎么查看自己的電腦是 x86 系統(tǒng)還是 x64 系統(tǒng)呢?
我們可以右鍵點(diǎn)擊【我的電腦】的屬性,在【系統(tǒng)類(lèi)型】中可以看到,如下圖所示:
可以看到博主的電腦是 64 位操作系統(tǒng),基于 x64 的處理器
接下來(lái)我們?cè)賮?lái)看下創(chuàng)建了一個(gè)新項(xiàng)目后文件夾多出了哪些文件
F:\project\test
├─test
│ ├─test.vcxproj
│ ├─test.vcxproj.filters
│ └─test.vcxproj.user
└─test.sln
Visual Studio 在創(chuàng)建項(xiàng)目時(shí)會(huì)自動(dòng)生成一個(gè)默認(rèn)的文件夾結(jié)構(gòu),其中包括解決方案文件、項(xiàng)目文件、過(guò)濾器文件和用戶項(xiàng)目文件。生成多層文件夾結(jié)構(gòu)的原因是為了更好地組織和管理項(xiàng)目的相關(guān)文件,避免混亂。
可以看到 test 項(xiàng)目文件夾下又包含了一個(gè) test 文件夾和一個(gè) test.sln,而下屬的 test 文件夾下又包含了三個(gè)文件,在 Visual Studio 項(xiàng)目中,.sln 文件是解決方案文件,.vcxproj 文件是項(xiàng)目文件,而 .vcxproj.filters 文件是用于組織項(xiàng)目結(jié)構(gòu)的過(guò)濾器文件,.vcxproj.user 文件包含了特定用戶的項(xiàng)目設(shè)置。讓我們來(lái)看一下這些文件的作用:(from chatGPT)
-
.sln 文件(解決方案文件): 解決方案文件包含一個(gè)或多個(gè)項(xiàng)目,可以將多個(gè)項(xiàng)目組織在一個(gè)解決方案中。解決方案文件本身不存放項(xiàng)目文件,而是引用項(xiàng)目文件的路徑和信息。一個(gè)解決方案可能包含多個(gè)項(xiàng)目,這些項(xiàng)目可以是不同類(lèi)型的應(yīng)用程序、庫(kù)、測(cè)試等。
-
.vcxproj 文件(項(xiàng)目文件): 項(xiàng)目文件是特定類(lèi)型的項(xiàng)目的配置文件,例如 C++ 項(xiàng)目就使用 .vcxproj 文件。它包含了項(xiàng)目的編譯、鏈接和部署等設(shè)置。通常,一個(gè)解決方案中會(huì)包含一個(gè)或多個(gè) .vcxproj 文件,每個(gè)文件對(duì)應(yīng)一個(gè)項(xiàng)目。
-
.vcxproj.filters 文件(過(guò)濾器文件): 過(guò)濾器文件用于組織項(xiàng)目中的文件,將源代碼、頭文件、資源等文件按照文件夾結(jié)構(gòu)進(jìn)行分類(lèi),以便在 Visual Studio 中更好地組織和瀏覽項(xiàng)目文件。
-
.vcxproj.user 文件(用戶項(xiàng)目文件): 用戶項(xiàng)目文件包含了特定用戶對(duì)項(xiàng)目的一些自定義設(shè)置,例如編譯器選項(xiàng)、調(diào)試選項(xiàng)等。這些設(shè)置是個(gè)人化的,不會(huì)與其他人共享。
在 Visual Studio 中,解決方案文件所在的文件夾通常作為頂層文件夾,其中包含項(xiàng)目文件和其他輔助文件。你看到的多層文件夾結(jié)構(gòu)只是為了更好地組織和管理項(xiàng)目文件,不同的文件承擔(dān)不同的角色。
在一個(gè)解決方案(.sln 文件)中,可以包含多個(gè)項(xiàng)目(.vcxproj 文件),每個(gè)項(xiàng)目都可以有自己的 main.cpp 或其他入口文件。解決方案文件的作用是將多個(gè)項(xiàng)目組織在一起,而每個(gè)項(xiàng)目可以是不同類(lèi)型的應(yīng)用程序、庫(kù)等。因此,一個(gè)解決方案可以包含多個(gè)項(xiàng)目,每個(gè)項(xiàng)目都可以有自己的獨(dú)立的入口文件。
OK!簡(jiǎn)單分析完了以后,我們來(lái)編寫(xiě)一個(gè) main.cpp 程序文件用于輸出 “Hello World”,在正式編寫(xiě)代碼之前我們選擇 Debug 編譯模式,x64 編譯平臺(tái),我們往下繼續(xù)
3. 右鍵點(diǎn)擊解決方案 test 的源文件 → \rightarrow →添加 → \rightarrow →新建項(xiàng)
4. 創(chuàng)建 main.cpp 源文件,點(diǎn)擊【C++文件(.cpp)】,修改名稱,點(diǎn)擊添加
5. 編寫(xiě)代碼
6. 執(zhí)行,點(diǎn)擊菜單欄中的【調(diào)試】然后點(diǎn)擊【開(kāi)始執(zhí)行(不調(diào)試)】,或者按 Ctrl+F5 快捷鍵
7. 運(yùn)行效果如下
可以看到成功生成了 test.exe 可執(zhí)行文件,并且終端成功打印了 “Hello World”
OK!那以上就是一個(gè)最簡(jiǎn)單最基本的項(xiàng)目的創(chuàng)建,接下來(lái)我們來(lái)看點(diǎn)稍微高級(jí)點(diǎn)的東西
4. 配置OpenCV庫(kù)
我們?cè)陂_(kāi)發(fā)項(xiàng)目時(shí)經(jīng)常需要使用到一些第三方庫(kù),比如 CUDA、cuDNN、TensorRT、OpenCV 等等,那接下來(lái)我們學(xué)習(xí)下如何在我們自己創(chuàng)建的項(xiàng)目中引用第三方庫(kù),我們以 OpenCV 為例,其它第三方庫(kù)類(lèi)似
參考自:VS2017配置 opencv 教程(超詳細(xì)!?。。?、一文搞定 Visual Studio 配置 OpenCV 環(huán)境
4.1 下載opencv安裝包
下載地址:https://opencv.org/releases/
網(wǎng)盤(pán)下載:Baidu Driver【pwd:1234】
博主以 OpenCV-4.5.0 為例,點(diǎn)擊 Windows 后即可完成下載,
由于是外網(wǎng)訪問(wèn)下載速度可能比較慢,記得開(kāi)代理,這邊提供博主下載好的幾個(gè)不同版本的安裝包,Baidu Driver【pwd:1234】
我們把下載好的安裝包移動(dòng)到指定文件夾下,建議大家建立一個(gè)公共的文件夾,專(zhuān)門(mén)用來(lái)存放第三方庫(kù)文件,方便后續(xù)不同項(xiàng)目開(kāi)發(fā)的指定,博主將 OpenCV 安裝包移動(dòng)到了 F:\project\lean 文件夾下,在 lean 文件夾下后續(xù)可以存放各種各樣的第三方庫(kù),包括 CUDA、cuDNN、TensorRT 等
下載好的文件是一個(gè) .exe 可執(zhí)行文件,我們直接雙擊點(diǎn)擊 Extract 提取文件即可
耐心等待一段時(shí)間后,在 lean 文件夾下面會(huì)多出一個(gè) opencv 文件夾,這個(gè)就是我們安裝好的 opencv
那你可能會(huì)好奇,這樣就安裝完 opencv 了嗎?這不就相當(dāng)于下載了一個(gè)壓縮包然后解壓?jiǎn)幔?/p>
那其實(shí)沒(méi)錯(cuò),這樣就把 opencv 安裝完成了,后續(xù)的都是一些環(huán)境配置的問(wèn)題,與 Linux 下面編譯 opencv 不同的是在 Windows 下,OpenCV 提供了預(yù)編譯的二進(jìn)制發(fā)行版(直接提供編譯好的動(dòng)態(tài)庫(kù)),你只需要下載壓縮包并解壓,然后進(jìn)行相應(yīng)的環(huán)境配置即可使用。
而在 Linux 下,操作系統(tǒng)的軟件包管理方式通常是基于源代碼的編譯和安裝。這意味著大多數(shù)軟件包(例如 OpenCV)在 Linux 下需要從源代碼編譯生成可執(zhí)行文件和庫(kù)(手動(dòng)編譯)。這種方式允許用戶根據(jù)自己的需要進(jìn)行定制和優(yōu)化,并且能夠適應(yīng)不同的 Linux 發(fā)行版和體系結(jié)構(gòu)。
4.2 配置系統(tǒng)環(huán)境變量
在 Windows 下使用 OpenCV 時(shí),我們還需要將 OpenCV 的 bin 目錄添加到系統(tǒng)環(huán)境變量中。這樣做的目的是為了讓操作系統(tǒng)能夠找到 OpenCV 的動(dòng)態(tài)鏈接庫(kù)(DLL)文件。這樣,當(dāng)你在你的項(xiàng)目中使用 OpenCV 時(shí),系統(tǒng)就可以在環(huán)境變量中查找到所需的 DLL 文件并加載它們。而不至于說(shuō)找不到對(duì)應(yīng)的 DLL 庫(kù)文件而報(bào)錯(cuò)
首先我們要確保下我們需要添加的 bin 文件的路徑,bin 文件存放在我們剛才下載好的 opencv/build/x64 文件夾下,點(diǎn)開(kāi)這個(gè)文件夾你會(huì)發(fā)現(xiàn)存在 vc14 和 vc15 兩個(gè)不同的 bin 文件路徑,我們?cè)撨x擇哪個(gè)呢?
這其實(shí)涉及到 Visual Studio 的版本。這兩個(gè)版本分別對(duì)應(yīng)著不同的 Visual Studio 編譯器版本,具體來(lái)說(shuō):
vc14:這是指使用 Visual Studio 2015 編譯器編譯的版本。
vc15:這是指使用 Visual Studio 2017 或更新版本的編譯器編譯的版本。
選擇哪個(gè)版本取決于你使用的 Visual Studio 版本。如果你在使用 Visual Studio 2015,那么應(yīng)該選擇 vc14 版本的庫(kù)。如果你在使用 Visual Studio 2017 或更新版本,那么應(yīng)該選擇 vc15 版本的庫(kù)。
那博主的 Visual Studio 是 2017 版本的,因此選擇 vc15 版本,那最終博主要添加的 bin 文件的完整路徑就是 F:\project\lean\opencv\build\x64\vc15\bin
接下來(lái)我們就是要把上述的路徑添加到系統(tǒng)環(huán)境變量中
【找到此電腦】 → \rightarrow →【右鍵屬性】 → \rightarrow →【高級(jí)系統(tǒng)設(shè)置】 → \rightarrow →【環(huán)境變量】 → \rightarrow →【系統(tǒng)變量Path】 → \rightarrow →【編輯系統(tǒng)變量Path】 → \rightarrow →【新建把路徑復(fù)制進(jìn)去點(diǎn)擊確定】
特別注意?。?! 我們?cè)谂渲猛晗到y(tǒng)環(huán)境變量后其實(shí)是沒(méi)有生效的,你需要重啟電腦來(lái)確保環(huán)境變量生效,如果你沒(méi)有重啟電腦刷新環(huán)境變量,即使你后續(xù)配置了庫(kù)文件和鏈接庫(kù)也會(huì)提示找不到對(duì)應(yīng)的 opencv_world450d.dll 動(dòng)態(tài)庫(kù),如下圖所示:
因此需要重啟電腦來(lái)使得環(huán)境變量生效
OK!以上就是 OpenCV 系統(tǒng)環(huán)境變量的配置,也就是在系統(tǒng)變量路徑中添加了一個(gè) OpenCV 的 bin 路徑
4.3 VS項(xiàng)目環(huán)境配置
我們接下來(lái)就去看看項(xiàng)目中該如何去配置,我們拿之前創(chuàng)建的 test 項(xiàng)目為例,如果我想要在這個(gè)項(xiàng)目中使用 opencv 讀取一張圖片并顯示,我該如何做呢?
上來(lái)我們就直接來(lái)編寫(xiě)程序,首先需要包含 opencv 的頭文件 opencv2/opencv.hpp
可以看到編譯器提示頭文件找不到,那這是因?yàn)槲覀儾](méi)有告訴編譯器去哪里找 opencv,也就是沒(méi)有配置 opencv 的頭文件目錄,接下來(lái)我們配置下 opencv 的頭文件目錄
右鍵點(diǎn)擊解決方案 test,點(diǎn)擊屬性(或者直接點(diǎn)擊上面的小扳手),
點(diǎn)擊進(jìn)來(lái)后可以看到該項(xiàng)目(test)的屬性頁(yè)面,那么這個(gè)屬性頁(yè)面是非常非常重要的,你可以在這里配置這個(gè)項(xiàng)目的所有東西,比如項(xiàng)目所依賴的頭文件目錄、庫(kù)文件目錄、鏈接的動(dòng)態(tài)庫(kù)等等,你可以把它理解為 Linux 上面的 CMakeLists.txt 或者 Makefile 文件
那一進(jìn)來(lái)其它的先不看,我們先來(lái)看下上面的兩個(gè)配置,一個(gè)是編譯模式的選擇,另外一個(gè)是編譯平臺(tái)的選擇,那你可能會(huì)疑問(wèn),前面的 活動(dòng) 又是什么意思呢?
那在 Visual Studio 項(xiàng)目的屬性頁(yè)面中,帶有 “(Active)” 標(biāo)簽的選項(xiàng)是指當(dāng)前處于活動(dòng)狀態(tài)的配置。這意味著在你進(jìn)行項(xiàng)目編譯、調(diào)試、運(yùn)行等操作時(shí),所使用的配置選項(xiàng)是標(biāo)記為 “(Active)” 的配置。
那么當(dāng)前我們是在 x64 平臺(tái)下的 Debug 編譯模式,因此就先配置 x64 和 Debug。那你可能會(huì)好奇,Debug 和 Release 編譯模式下項(xiàng)目所依賴的頭文件、庫(kù)文件不是都一樣嗎?為什么不選擇 “所有配置” 一起配置呢?
那之前有提到過(guò) Debug 和 Release 的區(qū)別,為了調(diào)試方便在 Debug 模式下我們是沒(méi)有進(jìn)行優(yōu)化的,而在 Release 模式下我們是使用了優(yōu)化的,想必你也猜到了,opencv 官方提供的 opencv 動(dòng)態(tài)庫(kù)其實(shí)是存在 Debug 和 Release 兩個(gè)的,在不同編譯模式下我們應(yīng)該選擇不同的動(dòng)態(tài)庫(kù),這點(diǎn)后面會(huì)提到,因此建議還是分開(kāi)配置為好
那我們先來(lái)解決頭文件目錄問(wèn)題,我們先找到我們下載的 opencv 安裝包的頭文件目錄,它在 opencv\build\include 下面,對(duì)于博主的完整路徑是 F:\project\lean\opencv\build\include
找到了 opencv 安裝包頭文件的路徑,我們來(lái)配置頭文件目錄,在打開(kāi)的項(xiàng)目屬性頁(yè)中,在【VC++目錄】中的【包含目錄】編輯添加 OpenCV 的 include 文件夾路徑:
F:\project\lean\opencv\build\include
點(diǎn)擊確定可以看到【包含目錄】中多了 opencv 的頭文件路徑,如下圖所示:
然后我們還需要在【C/C++】下面【常規(guī)】中的【附加包含目錄】編輯添加 OpenCV 的 include 文件夾路徑:
F:\project\lean\opencv\build\include
點(diǎn)擊確定可以看到【附加包含目錄】中多了 opencv 的頭文件路徑
那你可能會(huì)問(wèn),之前不是在【VC++目錄】中配置了頭文件目錄嗎?為什么還要再配置一次呢???
這是因?yàn)殡m然你可能在項(xiàng)目屬性頁(yè)的【VC++目錄】中配置了包含目錄使得你的項(xiàng)目能夠正常編譯。但是一般來(lái)說(shuō),還是推薦在【C/C++】 → \rightarrow →【常規(guī)】中配置【附加包含目錄】。這是因?yàn)樵谶@里設(shè)置的附加包含目錄會(huì)對(duì)整個(gè)項(xiàng)目中的源文件生效,而不需要針對(duì)每個(gè)源文件都單獨(dú)設(shè)置。這樣能夠提高代碼的可維護(hù)性,并且在項(xiàng)目需要擴(kuò)展或修改時(shí),更加方便管理。
此時(shí)再看代碼可以發(fā)現(xiàn)編譯器沒(méi)有提示找不到 opencv 的頭文件了,說(shuō)明我們添加成功了
OK!頭文件添加成功了我們就來(lái)把后續(xù)的代碼完成,整體代碼如下:
代碼非常簡(jiǎn)單就是利用 OpenCV 讀取一張圖片然后顯示,那你可能會(huì)好奇,代碼中圖片的路徑是根據(jù)相對(duì)目錄來(lái)指定的,那這個(gè)相對(duì)目錄是相對(duì)誰(shuí)而言的呢?
在 Visual Studio 中,相對(duì)目錄是相對(duì)于項(xiàng)目文件所在的文件夾來(lái)指定的。項(xiàng)目文件通常是具有 .vcxproj 擴(kuò)展名的文件,它包含有關(guān)項(xiàng)目的配置和設(shè)置信息。相對(duì)目錄是相對(duì)于這個(gè)項(xiàng)目文件所在的文件夾來(lái)進(jìn)行計(jì)算的。
例如,如果你的項(xiàng)目文件位于 F:\project\test\test\test.vcxproj,而你的圖片文件位于 F:\project\test\test\workspace\Lenna.png,那么在項(xiàng)目中引用圖片時(shí),相對(duì)路徑應(yīng)該是 workspace\bus.jpg。如下圖所示:
那我們直接按 Ctrl+F5 來(lái)執(zhí)行,可以看到編譯報(bào)錯(cuò)了,如下圖所示:
無(wú)法解析的外部符號(hào)…,那這個(gè)問(wèn)題主要是由于鏈接器(Linker)無(wú)法找到所需的函數(shù)的實(shí)際定義,而在代碼中該函數(shù)卻被引用了。
那你可能回想起來(lái)了,雖然我們添加了頭文件目錄,但是我們貌似并沒(méi)有添加庫(kù)文件目錄,沒(méi)有正確地鏈接上 OpenCV 庫(kù)呀,在 Visual Studio 中,我們需要將正確的 OpenCV 庫(kù)文件夾添加到項(xiàng)目屬性的庫(kù)目錄,并將所需的庫(kù)名稱添加到項(xiàng)目屬性的附加依賴項(xiàng)中。我們接下來(lái)就做這么一件事情
首先我們要找到庫(kù)文件的目錄,它在 opencv\build\x64\vc15\lib 下面,對(duì)于博主的完整路徑是 F:\project\lean\opencv\build\x64\vc15\lib
然后我們?cè)诖蜷_(kāi)的項(xiàng)目屬性頁(yè)中,在【VC++目錄】中的【庫(kù)目錄】編輯添加 OpenCV 的 lib 文件夾路徑:
F:\project\lean\opencv\build\x64\vc15\lib
點(diǎn)擊確定后可以看到【庫(kù)目錄】中多了 opencv 的庫(kù)文件路徑
那此時(shí)我們只是設(shè)置了庫(kù)文件目錄,需要具體鏈接的庫(kù)文件還沒(méi)有真正配置,我們接下來(lái)配置鏈接器
在我們打開(kāi)的項(xiàng)目屬性頁(yè)中,在【鏈接器】下面的【輸入】中的【附加依賴項(xiàng)】編輯添加需要鏈接的 OpenCV 庫(kù)文件:
那可能你會(huì)好奇我怎么知道鏈接的庫(kù)文件名稱呢,那其實(shí)在 opencv\build\x64\vc15\lib 庫(kù)文件目錄下就有 .lib 后綴結(jié)尾的兩個(gè)庫(kù)文件,如下圖所示:
上面兩個(gè)庫(kù)文件就是我們需要鏈接的 opencv 庫(kù),那你可能會(huì)問(wèn)不是有 opencv_world450.lib 和 opencv_world450d.lib 兩個(gè)庫(kù)嘛,具體鏈接哪一個(gè)呢?還是說(shuō)都需要添加???
那這其實(shí)是 OpenCV 庫(kù)的兩個(gè)不同版本,分別用于 Release(Release 模式)和 Debug(Debug 模式)構(gòu)建。
- opencv_world450.lib 是用于 Release 模式的庫(kù)文件。當(dāng)你在 Release 模式下構(gòu)建你的應(yīng)用程序時(shí),應(yīng)該鏈接到這個(gè)庫(kù)。
- opencv_world450d.lib 是用于 Debug 模式的庫(kù)文件。當(dāng)你在 Debug 模式下構(gòu)建你的應(yīng)用程序時(shí),應(yīng)該鏈接到這個(gè)庫(kù)。
在 Visual Studio 項(xiàng)目中,根據(jù)你的編譯模式(Release 或 Debug),你需要設(shè)置鏈接器的庫(kù)依賴項(xiàng),分別鏈接到對(duì)應(yīng)的庫(kù)文件。如果在 Release 模式下編譯,確保鏈接到 opencv_world450.lib;如果在 Debug 模式下編譯,確保鏈接到 opencv_world450d.lib。這樣可以確保在不同的構(gòu)建模式下使用正確的庫(kù)。
由于博主的編譯模式是 Debug 模式,因此鏈接的是 opencv_world450d.lib 庫(kù),當(dāng)你編譯模式是 Release 模式時(shí),你需要選擇的是 opencv_world450.lib 庫(kù)
OK,庫(kù)文件路徑和對(duì)應(yīng)的鏈接庫(kù)配置完成了,我們?cè)侔?Ctrl+F5 執(zhí)行下
可以看到編譯通過(guò)了,而且圖像也正常顯示了,這說(shuō)明 opencv 庫(kù)的使用沒(méi)問(wèn)題了
OK!以上就是關(guān)于 OpenCV 庫(kù)的配置
4.4 總結(jié)
上面我們?cè)敿?xì)分析了在 Visual Studio 中如何使用 OpenCV 庫(kù),下面我們簡(jiǎn)單總結(jié)下如何在 Visual Studio 中使用一個(gè)第三方庫(kù)。總體可分為:系統(tǒng)環(huán)境變量配置和 Visual Studio 項(xiàng)目環(huán)境配置兩部分
1. 系統(tǒng)環(huán)境變量配置(optional)
這一步通常不是必須的,尤其是在使用靜態(tài)鏈接庫(kù)的情況下。但對(duì)于某些庫(kù),尤其是那些提供了可執(zhí)行文件的庫(kù)(例如 OpenCV),可能需要將其路徑添加到系統(tǒng)環(huán)境變量中,以便在終端中運(yùn)行可執(zhí)行文件時(shí)能夠正確找到依賴的庫(kù)文件。
2. Visual Studio 項(xiàng)目環(huán)境配置
2.1 包含目錄添加頭文件路徑 【VC++目錄】 → \rightarrow →【包含目錄】
這是為了在編譯時(shí)能夠找到第三方庫(kù)的頭文件。這通常是必須的,因?yàn)槟愕脑创a中會(huì)包含庫(kù)的頭文件以訪問(wèn)其函數(shù)和類(lèi)。
2.2 附加包含目錄中添加頭文件路徑 【C/C++】 → \rightarrow →【常規(guī)】 → \rightarrow →【附加包含目錄】
這一步是為了告訴編譯器在哪里找到你所使用的第三方庫(kù)的頭文件。將頭文件路徑添加到項(xiàng)目的 附加包含目錄 中,確保項(xiàng)目的每個(gè)源文件都能找到所需的頭文件。這提高了項(xiàng)目的可維護(hù)性,因?yàn)槟悴恍枰獮槊總€(gè)源文件都手動(dòng)設(shè)置包含路徑。
2.3 庫(kù)目錄添加庫(kù)文件路徑 【VC++目錄】 → \rightarrow →【庫(kù)目錄】
這是為了告訴鏈接器在哪里找到庫(kù)文件。通常來(lái)說(shuō),你需要將庫(kù)文件的路徑添加到項(xiàng)目的 庫(kù)目錄 中,以便鏈接器能夠找到所需的庫(kù)文件。
2.4 鏈接器設(shè)置添加鏈接庫(kù) 【鏈接器】 → \rightarrow →【輸入】 → \rightarrow →【附加依賴項(xiàng)】
這是為了告訴鏈接器需要鏈接哪些庫(kù)文件。根據(jù)你使用的庫(kù),你可能需要在項(xiàng)目的 附加依賴項(xiàng) 中添加相應(yīng)的庫(kù)文件名,如 opencv_world450.lib。
5. 已有項(xiàng)目添加
假設(shè)我在 Linux 上面開(kāi)發(fā)了一個(gè)新的項(xiàng)目,后續(xù)我想在 Windows 下面開(kāi)發(fā),我該如何把已有項(xiàng)目添加到 Visual Studio 中繼續(xù)開(kāi)發(fā)呢?
這邊拿一個(gè)非常簡(jiǎn)單的示例說(shuō)明下,假設(shè) Linux 下開(kāi)發(fā)的項(xiàng)目文件目錄結(jié)構(gòu)如下:
src
├─common
│ ├─ilogger.cpp
│ └─ilogger.hpp
└─main.cpp
整個(gè)項(xiàng)目文件非常簡(jiǎn)單(為了方便說(shuō)明,實(shí)際情況肯定復(fù)雜得多),只包含一個(gè) src 文件夾存放著所有的源代碼,在 src 文件夾下又包含一個(gè) common 文件夾和一個(gè) main.cpp 文件
common 文件夾下有 ilogger.hpp 和 ilogger.cpp 兩個(gè)文件,它們其實(shí)來(lái)源于 https://github.com/shouxieai/tensorRT_Pro/tree/main/src/tensorRT/common
這兩個(gè)文件是杜老師實(shí)現(xiàn)的,功能是為用戶提供了一個(gè)日志庫(kù),該庫(kù)支持多種日志級(jí)別,并提供了文件操作、日期和時(shí)間、字符串操作、顏色轉(zhuǎn)換等輔助功能。此外,它還考慮了跨平臺(tái)的需求,為 Windows 和 Linux 提供了特定的實(shí)現(xiàn)。
由于它的日志打印包含時(shí)間、文件行號(hào)非常適合調(diào)試,同時(shí)還提供了一些小工具函數(shù),因此博主經(jīng)常將它包含在自己的項(xiàng)目中。那具體代碼實(shí)現(xiàn)其實(shí)并不重要,我們的主要目的還是說(shuō)如何把它添加到 Visual Studio 中
main.cpp 中的內(nèi)容非常簡(jiǎn)單,就是利用 ilogger 中的 INFO 函數(shù)進(jìn)行 “Hello World” 打印并打印當(dāng)前的時(shí)間,其代碼如下:
#include <iostream>
#include <common/ilogger.hpp>
using namespace std;
int main() {
INFO("Hello World");
string now = iLogger::time_now();
INFO("time now = %s", now.c_str());
return 0;
}
接下來(lái)我們重點(diǎn)來(lái)看如何把已有項(xiàng)目添加到 Visual Studio 中,首先我們?cè)?Visual Studio 中新建一個(gè)項(xiàng)目 test,然后將 Linux 下所有與項(xiàng)目相關(guān)的文件都放在與 test.vcxproj 項(xiàng)目文件的同級(jí)目錄下,如下圖所示:
那此時(shí)你就犯難了,怎么在解決方案 test 中把 src 下面的這些 C++ 文件都添加進(jìn)去呢?
明明我們把整個(gè) src 文件夾都復(fù)制過(guò)來(lái)了,為什么在解決方案中看不到任何文件呢?
那其實(shí)是因?yàn)槟氵€沒(méi)有把它們添加到項(xiàng)目中去,在 Visual Studio 解決方案窗口中,文件的顯示是基于項(xiàng)目文件(.vcxproj)的結(jié)構(gòu)和內(nèi)容的。如果你在 .vcxproj 的同級(jí)目錄下創(chuàng)建了一個(gè)文件夾,并在其中添加了一些 C++ 文件,但在解決方案窗口中看不到文件的顯示,是因?yàn)檫@些文件尚未被添加到項(xiàng)目中。
在 Visual Studio 中,文件需要添加到項(xiàng)目中,才能在解決方案窗口中正確顯示和管理。這是因?yàn)榻鉀Q方案窗口顯示的是項(xiàng)目的文件結(jié)構(gòu),而不是文件系統(tǒng)中的實(shí)際文件結(jié)構(gòu)。
那我們?cè)撊绾翁砑幽兀?/p>
我們可以點(diǎn)擊解決方案資源管理器的小扳手的左邊的小圖標(biāo)【顯示所有文件】,然后就可以看到與 test.vcxproj 同級(jí)目錄下的所有文件了,接下來(lái)我們右鍵點(diǎn)擊 src,選擇【包括在項(xiàng)目中】,如下圖所示:
添加完成后再點(diǎn)擊小圖標(biāo)【顯示所有文件】回到之前的解決方案窗口,此時(shí)可以看到 src 文件夾下的所有文件都被包含進(jìn)來(lái)了,如下圖所示:
值得注意的是 Visual Studio 會(huì)將添加進(jìn)來(lái)的所有 .cpp 文件全部放到源文件下,而所有的 .hpp 文件全部放到 頭文件下,我們可以使用 “新建篩選器” 來(lái)創(chuàng)建邏輯上的文件夾結(jié)構(gòu),以更好的組織項(xiàng)目文件
博主還是喜歡在 Linux 下的文件目錄結(jié)構(gòu),因此【右鍵源文件】 → \rightarrow →【添加】 → \rightarrow →【新建篩選器】 → \rightarrow →【命名common】 → \rightarrow →【把ilogger.hpp和ilogger.cpp移過(guò)來(lái)】
最終的目錄結(jié)構(gòu)如下圖所示:
那你可能會(huì)好奇,篩選器是個(gè)啥玩意?我在這邊創(chuàng)建篩選器移動(dòng)文件會(huì)不會(huì)影響到實(shí)際的文件結(jié)構(gòu)呢???
那在 Visual Studio 的解決方案中,“新建篩選器” 是一種組織項(xiàng)目文件的方式,類(lèi)似于文件夾,但在實(shí)際的文件系統(tǒng)中并不會(huì)創(chuàng)建真正的文件夾。它主要用于在解決方案中對(duì)項(xiàng)目文件進(jìn)行邏輯上的分組和組織,以便更好地管理和維護(hù)項(xiàng)目。(from chatGPT)
當(dāng)你在解決方案中創(chuàng)建一個(gè)新的篩選器時(shí),它會(huì)在解決方案資源管理器中顯示為一個(gè)文件夾圖標(biāo),但并不會(huì)在文件系統(tǒng)中創(chuàng)建實(shí)際的文件夾。你可以在篩選器下添加項(xiàng)目文件,這些文件實(shí)際上會(huì)存儲(chǔ)在指定的項(xiàng)目文件夾內(nèi),但它們?cè)?Visual Studio 中的展示方式更加組織化。
使用篩選器的主要好處是在項(xiàng)目變得龐大時(shí)能夠更好地組織項(xiàng)目文件,使其更易于導(dǎo)航和維護(hù)。你可以根據(jù)自己的項(xiàng)目需求,將不同類(lèi)型的文件、相關(guān)的代碼文件等放置在不同的篩選器下。
我們點(diǎn)開(kāi) main.cpp 中發(fā)現(xiàn)頭文件無(wú)法打開(kāi),如下圖所示:
那這是個(gè)老問(wèn)題了,在配置 opencv 的時(shí)候我們也遇到過(guò),就是頭文件目錄問(wèn)題
你并沒(méi)有告訴編譯器這個(gè)頭文件要去哪個(gè)目錄下找,編譯器找不到當(dāng)然就報(bào)錯(cuò)咯。因此我們需要在項(xiàng)目屬性頁(yè)的【VC++目錄】 → \rightarrow →【包含目錄】和【C/C++】 → \rightarrow →【常規(guī)】 → \rightarrow → 【附加包含目錄】中都添加 ilogger.hpp 的頭文件目錄,在博主的環(huán)境中,這個(gè)路徑位于 F:\project\test\test\src
我們?cè)俅位氐?main.cpp 中可以看到?jīng)]問(wèn)題了,如下圖所示:
由于這個(gè)簡(jiǎn)單的項(xiàng)目并不需要使用庫(kù)文件,因此我們不需要配置庫(kù)文件目錄和鏈接對(duì)應(yīng)的庫(kù),接下來(lái)我們按 Ctrl+F5 執(zhí)行,如下圖所示:
可以發(fā)現(xiàn)存在一些問(wèn)題,那這個(gè)問(wèn)題是由于 common 下面的兩個(gè)文件導(dǎo)致的
雖然日志文件對(duì) Windows 做了特定實(shí)現(xiàn),但是可以看到還是存在一些移植問(wèn)題的,那往后的具體解決方法是單純針對(duì)于這個(gè)特定項(xiàng)目而言的,大家可以做簡(jiǎn)單的了解,主要是把握住前面的內(nèi)容即如何把一個(gè)已有項(xiàng)目添加到 Visual Studio 中
OK!我們來(lái)看存在的問(wèn)題,主要分為兩個(gè)問(wèn)題,我們一個(gè)個(gè)解決
問(wèn)題1:C4996 ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
分析:使用 sprintf 格式化字符串出錯(cuò), sprintf 函數(shù)在處理字符串時(shí)存在一些安全性問(wèn)題,因?yàn)樗鼪](méi)有提供足夠的保護(hù)機(jī)制來(lái)防止緩沖區(qū)溢出。為了增加代碼的安全性,Visual Studio 推薦使用 sprintf_s 函數(shù)代替sprintf。
解決:錯(cuò)誤信息中其實(shí)提到了幾個(gè)解決辦法,最簡(jiǎn)單的就是使用 sprintf_s 函數(shù)來(lái)替換 sprintf 函數(shù),另外就是 使用 _CRT_SECURE_NO_WARNINGS 宏
博主在這里選擇第二種解決方法,使用 _CRT_SECURE_NO_WARNINGS 宏,在項(xiàng)目屬性頁(yè)的 【C/C++】 → \rightarrow →【預(yù)處理器】 → \rightarrow →【預(yù)處理器定義】 → \rightarrow →【添加_CRT_SECURE_NO_WARNINGS 】
問(wèn)題2:C4996 ‘_getsystime’: This function or variable has been superceded by newer library or operating system functionality. Consider using GetLocalTime instead. See online help for details.
分析:這個(gè)錯(cuò)誤是由于你使用了過(guò)時(shí)的函數(shù) _getsystime,而新的庫(kù)或操作系統(tǒng)功能已經(jīng)取代了它。建議你考慮使用 GetLocalTime 函數(shù)來(lái)替代 _getsystime。GetLocalTime 函數(shù)是 Windows API 中的一個(gè)函數(shù),用于獲取本地時(shí)間。
解決:這個(gè)需要我們小改 ilogger.cpp 中的代碼,如下所示
// ===== ilogger.cpp 50行 =====
#if defined(U_OS_WINDOWS)
#define __GetTimeBlock \
SYSTEMTIME t; \
GetLocalTime(&t);
#endif
// ===== ilogger.cpp 100行 =====
string date_now() {
char time_string[20];
__GetTimeBlock;
sprintf(time_string, "%04d-%02d-%02d", t.wYear, t.wMonth, t.wDay);
return time_string;
}
string time_now() {
char time_string[20];
__GetTimeBlock;
sprintf(time_string, "%04d-%02d-%02d %02d:%02d:%02d", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
return time_string;
修改完成后再去 Ctrl+F5 執(zhí)行下,可以看到如下結(jié)果:
可以看到運(yùn)行成功了,成功打印出了 Hello World 和當(dāng)前的時(shí)間
OK!以上就是關(guān)于如何在 Visual Studio 中添加一個(gè)已有的項(xiàng)目
6. Tips
這個(gè)小節(jié)主要分享 Visual Studio 使用過(guò)程中的一些小技巧
6.1 常用快捷鍵
-
Ctrl+K Ctrl+C 注釋?zhuān)?Ctrl+K Ctrl+U 取消注釋
-
Alt+↑,Alt+↓ 上下移動(dòng)該行
-
shift+ → \rightarrow → 選擇
-
ctrl+shift+enter 在下一行插入,ctrl+enter 在上一行插入
-
更多快捷鍵參考:快捷鍵大全
6.2 字體和顏色選擇
- 博主使用 VSCode 習(xí)慣了 Consolas 字體,因此在【菜單欄】 → \rightarrow →【工具】 → \rightarrow →【選項(xiàng)】 → \rightarrow →【常規(guī)】 → \rightarrow →【字體和顏色】
- 參考:更改字體和顏色
6.3 配置編譯路徑
那你可能會(huì)好奇我們?cè)诰幾g執(zhí)行的過(guò)程中產(chǎn)生的中間文件和可執(zhí)行文件在哪里呢?
其實(shí)你如果仔細(xì)觀察我們的項(xiàng)目文件夾,會(huì)發(fā)現(xiàn)不知不覺(jué)中多了很多其余的文件,只是我們之前都沒(méi)有關(guān)注而已,其實(shí)編譯產(chǎn)生的中間文件在 .vcxproj 的同級(jí)目錄下,由于博主使用的是 Debug 編譯模式,平臺(tái)是 x64,那么中間文件就在 x64/Debug 文件夾下
編譯最終產(chǎn)生的可執(zhí)行文件在 .sln 的同級(jí)目錄下,由于博主使用的是 Debug 編譯模式,平臺(tái)是 x64,那么可執(zhí)行文件就在 x64/Debug 文件夾下
我們配置編譯路徑主要是為了防止文件污染,確保生成的中間文件和可執(zhí)行文件都在我們指定的位置
我們現(xiàn)在希望生成的中間文件存儲(chǔ)在 .vcxproj 同級(jí)目錄下的 objs 文件夾下,可執(zhí)行文件存儲(chǔ)在 workspace 文件夾下,如下圖所示:
那我們?cè)撊绾闻渲媚兀?/p>
首先先點(diǎn)開(kāi)項(xiàng)目屬性頁(yè),在【常規(guī)】 → \rightarrow →【輸出目錄】/【中間目錄】可以配置對(duì)應(yīng)路徑
可以看到它有默認(rèn)的路徑,是通過(guò)一些宏定義來(lái)實(shí)現(xiàn)的:
$(SolutionDir):解決方案名,即 .sln 所在路徑
$(Platform):解決方案平臺(tái)名稱,如 x86、x64
$(Configuration):當(dāng)前的編譯配置名稱,如 Release、Debug
$(ProjectName):當(dāng)前工程(項(xiàng)目)名稱,如示例中的 test
(補(bǔ)充)我們可以在:項(xiàng)目(鼠標(biāo)右鍵)→屬性→配置屬性→常規(guī)→輸出目錄(點(diǎn)擊下拉箭頭)→編輯→宏中看到相應(yīng)名稱和值的一一對(duì)應(yīng)關(guān)系。
參考自:vs2017+配置工程的編譯路徑(輸出目錄和中間目錄)
那么我們也可以利用這些宏定義來(lái)實(shí)現(xiàn)對(duì)應(yīng)的編譯路徑指定,如下圖所示:
大家寫(xiě)完之后可以對(duì)照下面輸出的值,看是不是自己真正想要的路徑
指定完成后再去執(zhí)行代碼后,你會(huì)發(fā)現(xiàn)編譯的中間文件會(huì)放在 objs 下,可執(zhí)行文件放在 workspace 下,清清爽爽,看起來(lái)非常舒服??
結(jié)語(yǔ)
本篇博客簡(jiǎn)單分享并記錄了博主在學(xué)習(xí)和使用 Visual Studio 開(kāi)發(fā) C++ 項(xiàng)目時(shí)的一些基礎(chǔ)知識(shí),首先分享了 Visual Studio 的安裝和創(chuàng)建一個(gè)新項(xiàng)目,然后以 opencv 庫(kù)為例分享了第三方庫(kù)的使用,主要是頭文件和庫(kù)文件路徑的包含,以及鏈接器的庫(kù)文件鏈接,接下來(lái)分享了一個(gè)已有項(xiàng)目如何添加到 Visual Studio 中,我們需要把源文件都包含到項(xiàng)目中,并且指定項(xiàng)目中所使用的頭文件和庫(kù)文件路徑以及對(duì)應(yīng)的庫(kù),最后就是博主在使用過(guò)程中的學(xué)到的一些小技巧。
由于博主也只是初學(xué)者,后續(xù)有新的發(fā)現(xiàn)再和大家分享吧,這次就先到這里了,感謝各位看到最后,創(chuàng)作不易,讀后有收獲的看官請(qǐng)幫忙點(diǎn)個(gè)????
下載鏈接
- Visual Studio 2017安裝包【pwd:1234】
- OpenCV安裝包【pwd:1234】
參考
-
Visual Studio和Visual Studio Code(VSCode)的區(qū)別及如何選擇
-
Visual Studio中Debug與Release以及x86、x64、Any CPU的區(qū)別
-
VS2017配置 opencv 教程(超詳細(xì)?。。。?/p>
-
一文搞定 Visual Studio 配置 OpenCV 環(huán)境
-
Visual Studio快捷鍵大全
-
Visual Studio更改字體和顏色文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-718492.html
-
vs2017+配置工程的編譯路徑(輸出目錄和中間目錄)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-718492.html
到了這里,關(guān)于Visual Studio 2017安裝和項(xiàng)目配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!