指南)
Windows VsCode配置OpenCV、Eigen先說個人結(jié)論這兩年在Windows下用VsCode寫C圖像處理相關(guān)的代碼OpenCV和Eigen基本是繞不開的兩個庫。OpenCV負責圖像讀取、濾波、特征提取這些重活Eigen負責矩陣運算、線性代數(shù)這類數(shù)學底子。把這倆配進VsCode說難不難說簡單也真有不少坑。尤其是OpenCV光是編譯器版本對不上這一個問題就足夠讓人折騰一下午。這篇文章就圍繞“Windows VsCode配置OpenCV、Eigen”這條主線把完整的配置思路、操作步驟、踩坑記錄和排查方案都梳理一遍。按照當前比較主流的方案我會著重講MinGW-w64配合預編譯OpenCV的方式因為這套組合在VsCode里最省心MSVC方案后面會單獨對比說明。適合剛接觸C圖像處理、想在VsCode里把環(huán)境一次搞定的朋友參考。1. 方案選型與整體思路拆解1.1 為什么把OpenCV和Eigen放在一起配置這兩個庫在實際項目里經(jīng)常是搭檔關(guān)系。OpenCV自帶的矩陣類型和圖像數(shù)據(jù)結(jié)構(gòu)偏上層面向的是圖像像素操作而Eigen更底層專注純數(shù)學矩陣運算模板化程度高編譯期優(yōu)化能力強。做三維重建、相機標定、點云處理這類項目時算法核心往往用Eigen算圖像輸入輸出交給OpenCV兩邊數(shù)據(jù)還要來回轉(zhuǎn)換。我做過的一個模擬項目X就是這種結(jié)構(gòu)OpenCV讀入標定板圖像、提取角點角點坐標轉(zhuǎn)成Eigen的MatrixXd跑非線性優(yōu)化再把優(yōu)化結(jié)果畫回圖像里。如果只裝OpenCVEigen的矩陣運算得自己造輪子只裝Eigen圖像那套又得另想辦法。兩個一起配好后面的開發(fā)路徑會順暢很多。1.2 編譯器選型MinGW-w64還是MSVC這是整個配置過程里最關(guān)鍵的決策點。VsCode本身不是編譯器它只是編輯器真正編譯代碼的是底層的GCC、Clang或者MSVC。Windows上常見的選擇是MinGW-w64GCC的Windows發(fā)行版和MSVCVisual Studio的編譯器。我的建議是如果你主要在VsCode里開發(fā)不想碰Visual Studio那就選MinGW-w64。原因有幾個VsCode的tasks.json和launch.json調(diào)用g很方便參數(shù)直觀社區(qū)資料也多。預編譯好的OpenCV for Windows分為VC版和MinGW版如果用MinGW需要找對應(yīng)編譯鏈的版本后面會細說。MinGW的GCC對C17/20標準支持不錯模板庫如Eigen編譯無壓力。但要注意一個硬性約束編譯OpenCV程序用的編譯器必須和OpenCV庫本身編譯時的編譯器屬于同一系列。用MinGW的g去鏈接VC版MSVC編譯的OpenCV庫會報一堆看不懂的鏈接錯誤這不是你代碼的問題是ABI應(yīng)用二進制接口不兼容。這個問題是我見過最多的配置失敗原因之一后面排查章節(jié)會詳細講。1.3 獲取OpenCV預編譯包還是源碼編譯對絕大多數(shù)人來說直接下載預編譯的OpenCV包就夠了。預編譯包的好處是省時間解壓即用include和lib目錄都是現(xiàn)成的。需要注意的是版本號例如opencv-4.x.x的Windows安裝包解壓后里面通常帶一個build文件夾包含x64/vc15或x64/mingw這樣的子目錄這就是不同編譯器對應(yīng)的庫目錄。源碼編譯適合什么場景一是你需要OpenCV的contrib模塊比如SIFT、SURF這些在核心庫之外的功能二是你要自定義編譯選項比如去掉GUI依賴、開啟CUDA加速三是你用的是比較新的GCC版本預編譯包的MinGW庫版本太舊。如果只是學習、做課程設(shè)計或者中小型項目預編譯完全夠用。Eigen就簡單多了。它是個純頭文件庫只有include目錄里的頭文件沒有.lib和.dll下載源碼包后把Eigen目錄加到include路徑就行。不需要編譯不需要鏈接也不存在ABI匹配問題。注意Eigen版本迭代較快建議去官網(wǎng)下最新穩(wěn)定版。舊版本在某些新編譯器下可能報“無法識別的模板”等錯誤屬于庫自身兼容問題升級版本基本能解決。2. 環(huán)境準備與工具鏈安裝2.1 Windows下VsCode的必裝插件打開VsCode左側(cè)擴展面板搜索并安裝這幾個插件缺一個后面都會卡殼C/C微軟官方插件提供IntelliSense、調(diào)試支持和tasks配置模板。C/C Extension Pack包含調(diào)試器等配套組件省得一個個裝。CMake Tools如果用CMake組織項目這個必須裝它能自動識別CMakeLists.txt并配置構(gòu)建。Chinese Language Pack看著舒服非必須。裝插件沒什么難度重點是裝完后確認VsCode能識別g和gdb。如果電腦之前沒有MinGW環(huán)境我下面說怎么裝。2.2 MinGW-w64安裝兩種方式選擇一個方式一用MSYS2安裝。MSYS2是一個Windows下的軟件發(fā)行平臺用它的包管理器可以裝MinGW-w64工具鏈。打開MSYS2終端執(zhí)行pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-cmake這種方式的好處是包管理和更新都很方便GCC版本也比較新推薦。方式二直接下載MinGW-w64的壓縮包解壓。這里要特別提醒網(wǎng)上有些一鍵安裝版或者第三方整合包版本陳舊且結(jié)構(gòu)混亂容易導致g路徑找不到或者和OpenCV庫不匹配。如果選擇手動建議去官方倉庫下載解壓到C:\mingw64然后把C:\mingw64\bin加入系統(tǒng)環(huán)境變量Path。安裝完打開命令行執(zhí)行g(shù) --version能正常顯示版本號就說明MinGW裝好了。2.3 環(huán)境變量配置細節(jié)需要把以下路徑加入系統(tǒng)Path以我的目錄為例你需要按實際安裝位置修改C:\mingw64\bing、gdb所在目錄C:\opencv\build\x64\mingw\binOpenCV的DLL目錄看你下載的預編譯包結(jié)構(gòu)C:\eigen3\這個不需要加Path但后面配置include時需要加Path的方法WinR打開運行輸入sysdm.cpl在“高級”選項卡點“環(huán)境變量”找到系統(tǒng)變量中的Path點編輯新建幾條路徑。改完P(guān)ath必須重啟VsCode才能生效這是很多人忽略的點環(huán)境變量改了VsCode不會自動刷新。2.4 Eigen源碼結(jié)構(gòu)確認去官網(wǎng)下載Eigen的zip包解壓后你會看到這樣一個目錄結(jié)構(gòu)eigen-3.4.0/ ├── Eigen/ # 核心頭文件目錄包含Dense、Geometry等子目錄 ├── unsupported/ # 非官方支持的擴展模塊如FFT、矩陣函數(shù) ├── doc/ └── CMakeLists.txt配置include路徑時要把eigen-3.4.0這個根目錄加進去而不是加里面的Eigen子目錄因為代碼里寫的是#include Eigen/Dense編譯器會在include路徑下找Eigen這個文件夾。這個細節(jié)錯了報錯信息永遠是“找不到Eigen/Dense文件”。3. 核心配置c_cpp_properties.json的完整寫法3.1 為什么這個文件是IntelliSense的命門VsCode的C/C插件靠c_cpp_properties.json來獲取編譯器路徑、include路徑和C標準。如果這個文件配置不對最典型的問題是紅波浪線到處都是明明你編譯能通過編輯器卻一直提示找不到opencv2/opencv.hpp或Eigen/Dense。這個文件的核心屬性包括compilerPath指向g.exe的完整路徑插件根據(jù)它推斷系統(tǒng)標準頭文件位置。includePath告訴IntelliSense去哪里找第三方庫的頭文件。cppStandardC標準建議設(shè)置成c17OpenCV和Eigen都支持。intelliSenseModewindows-gcc-x64對應(yīng)MinGW工具鏈。configurationProvider如果用CMake可以填ms-vscode.cmake-tools讓CMake插件接管IntelliSense配置。3.2 實際配置示例在.vscode目錄下創(chuàng)建c_cpp_properties.json內(nèi)容參考如下{ configurations: [ { name: Win64-MinGW, compilerPath: C:/mingw64/bin/g.exe, intelliSenseMode: windows-gcc-x64, includePath: [ ${workspaceFolder}/**, C:/opencv/build/include, C:/eigen-3.4.0 ], cppStandard: c17, cStandard: c11 } ], version: 4 }幾點解釋compilerPath用正斜杠或雙反斜杠都可以反斜杠需要轉(zhuǎn)義容易出錯我習慣都寫成正斜杠。includePath里${workspaceFolder}/**是為了讓編輯器能索引當前工程自己的頭文件。C:/eigen-3.4.0就是前面說的Eigen根目錄。如果OpenCV的預編譯包include目錄結(jié)構(gòu)是這樣的C:/opencv/build/include/opencv2那么includePath只需要寫到C:/opencv/build/include因為代碼里寫的是#include opencv2/opencv.hpp。這個文件配置好后重新打開VsCode紅波浪線應(yīng)該消失大半。如果還在報“無法打開源文件”基本就是includePath路徑寫錯了或者文件位置不對先雙擊錯誤信息定位到具體文件再回來看路徑。3.3 區(qū)分IntelliSense和編譯鏈接有一點要清楚c_cpp_properties.json只影響編輯器層面的代碼分析和提示它不參與實際編譯。你寫代碼時不報紅并不意味著編譯能過。實際的編譯和鏈接參數(shù)由tasks.json或CMake配置負責那里才是真正決定生成exe的地方。這也是新手容易混淆的地方把c_cpp_properties.json改了編譯還是報找不到頭文件于是反復改這個文件問題依舊。正確做法是如果編譯報找不到頭文件、找不到庫文件去改tasks.json或CMakeLists.txt如果只是編輯器提示出錯但編譯正常去改c_cpp_properties.json。4. 編譯配置tasks.json與CMake兩種路線4.1 簡單場景直接用tasks.json如果你的項目就是單個cpp文件或者文件不多用tasks.json調(diào)g命令是最快的。在.vscode目錄下創(chuàng)建tasks.json{ version: 2.0.0, tasks: [ { label: build-opencv-eigen, type: shell, command: g, args: [ -g, -stdc17, -I, C:/opencv/build/include, -I, C:/eigen-3.4.0, main.cpp, -o, main.exe, -L, C:/opencv/build/x64/mingw/lib, -lopencv_core, -lopencv_imgproc, -lopencv_imgcodecs, -lopencv_highgui ], group: { kind: build, isDefault: true } } ] }這里要特別說明鏈接參數(shù)。OpenCV在MinGW下的lib文件名是以lib開頭、.dll.a結(jié)尾的比如libopencv_core460.dll.a。g鏈接時寫-lopencv_core它會自動去找libopencv_core.dll.a這個文件。如果路徑或名字不對鏈接階段會報undefined reference to cv::imread之類的錯誤。需要鏈接哪些庫取決于你用到了OpenCV哪些模塊。常用對應(yīng)的庫名功能庫名核心矩陣操作opencv_core圖像處理濾波、形態(tài)學等opencv_imgproc圖像讀寫opencv_imgcodecs高層GUI界面opencv_highgui特征檢測與描述opencv_features2d相機標定與畸變矯正opencv_calib3d視頻讀寫opencv_videoio實際操作中你可以在OpenCV的mingw/lib目錄下看看具體有哪些.dll.a文件按需添加。鏈接多了沒關(guān)系最多是多幾個依賴DLL鏈接少了編譯也能過但運行時會提示找不到DLL。4.2 工程化管理用CMake組織文件一多tasks.json的命令參數(shù)就會變得臃腫維護困難。更推薦用CMake管理。項目根目錄創(chuàng)建CMakeLists.txt內(nèi)容示例如下cmake_minimum_required(VERSION 3.16) project(opencv_eigen_demo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Eigen 純頭文件只需include路徑 include_directories(C:/eigen-3.4.0) # OpenCV 通過find_package定位 set(OpenCV_DIR C:/opencv/build) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})有幾個坑先說在前面find_package(OpenCV REQUIRED)的OpenCV_DIR必須指向OpenCV的build目錄也就是包含OpenCVConfig.cmake或OpenCVConfig.cmake的目錄。如果指向不對CMake會提示找不到OpenCV。${OpenCV_LIBS}是自動鏈接不用手寫每個lib。但要注意這里鏈接來的庫是根據(jù)OpenCV_DIR里配置的編譯器來的。如果你的CMake用的是MinGW而OpenCV_DIR下的是VC庫鏈接照樣會失敗。解決方式是確保你的預編譯OpenCV包是MinGW版或者自己用MinGW編譯OpenCV。關(guān)于lib路徑如果用CMake MinGW在CMake緩存配置時如果出現(xiàn)“找不到libopencv_world”之類提示檢查一下CMAKE_PREFIX_PATH或OpenCV_DIR的設(shè)置。裝好CMake Tools插件后在VsCode里按CtrlShiftP輸入CMake: Configure選擇MinGW工具鏈然后點底部狀態(tài)欄的Build按鈕即可。構(gòu)建產(chǎn)物會在build目錄下生成的exe雙擊運行前要注意DLL路徑問題下面會說。4.3 運行時的DLL定位問題編譯鏈接成功只是第一步運行是另一個環(huán)節(jié)。生成的exe運行時會去加載OpenCV的DLL如果系統(tǒng)找不到DLL會直接彈窗報錯“找不到libopencv_core460.dll”或“應(yīng)用程序無法正常啟動0xc000007b”。這個問題的解決方案有三種把OpenCV的bin目錄加入系統(tǒng)Path這是最推薦的方法全局生效。把需要的DLL復制到exe同目錄下適合作業(yè)提交或分發(fā)場景。寫一個批處理腳本運行時臨時設(shè)置PATH。我一般采用第1種。需要注意改Path后必須完全重啟VsCode不只是關(guān)閉窗口要退出進程才能讓VsCode里的終端讀到新Path。5. 調(diào)試配置launch.json讓人能斷點Debug配置調(diào)試主要是為了能在VsCode里直接斷點、單步、看變量。這里說一下launch.json怎么配合前面配置的構(gòu)建任務(wù)。在.vscode目錄下創(chuàng)建launch.json{ version: 0.2.0, configurations: [ { name: Debug OpenCV Program, type: cppdbg, request: launch, program: ${workspaceFolder}/main.exe, args: [], stopAtEntry: false, cwd: ${workspaceFolder}, environment: [], externalConsole: true, MIMode: gdb, miDebuggerPath: C:/mingw64/bin/gdb.exe, setupCommands: [ { description: Enable pretty-printing for gdb, text: -enable-pretty-printing, ignoreFailures: true } ], preLaunchTask: build-opencv-eigen } ] }preLaunchTask會先執(zhí)行我們之前在tasks.json里定義的構(gòu)建任務(wù)編譯成功后再啟動調(diào)試。externalConsole設(shè)為true的好處是如果你的程序用了OpenCV的highgui窗口顯示圖片獨立的控制臺窗口能保證窗口正常彈出來不會和VsCode的內(nèi)置終端搶占界面焦點。gdb對MinGW編譯出來的程序調(diào)試支持得很好但有一點需要留意編譯時一定要加上-g參數(shù)否則gdb無法定位到源碼行號你看到的全是反匯編或者空白調(diào)用棧。6. 實操驗證一個完整的測試項目6.1 測試代碼的設(shè)計思路配置完環(huán)境用一個小例子做驗收。我的建議是覆蓋這幾個點讀入圖像、圖像處理灰度化和邊緣檢測、矩陣運算Eigen、結(jié)果輸出。這樣能同時驗證OpenCV的編譯鏈、DLL鏈接和Eigen的頭文件配置。6.2 完整代碼示例新建main.cpp代碼如下#include iostream #include opencv2/opencv.hpp #include Eigen/Dense int main() { // 生成一張300x300的灰度圖內(nèi)容是一個圓 cv::Mat image(300, 300, CV_8UC1, cv::Scalar(0)); cv::circle(image, cv::Point(150, 150), 100, cv::Scalar(255), -1); // OpenCV處理高斯模糊 Canny邊緣檢測 cv::Mat blurred; cv::GaussianBlur(image, blurred, cv::Size(3, 3), 0); cv::Mat edges; cv::Canny(blurred, edges, 50, 150); // Eigen運算構(gòu)造一個3x3矩陣并求逆、求特征值 Eigen::Matrix3d mat; mat 2, -1, 0, -1, 2, -1, 0, -1, 2; double det mat.determinant(); Eigen::Vector3d eigvals mat.eigenvalues().real(); std::cout det det std::endl; std::cout eigenvalues: eigvals.transpose() std::endl; // 在圖像上疊加Eigen計算結(jié)果轉(zhuǎn)成字符串 std::string detText det std::to_string(det); cv::putText(edges, detText, cv::Point(20, 30), cv::FONT_HERSHEY_SIMPLEX, 0.7, cv::Scalar(255), 2); cv::imwrite(output.png, edges); std::cout OpenCV and Eigen config test passed! std::endl; return 0; }這段代碼不需要外部圖片文件完全通過代碼生成一張圖避免路徑問題干擾測試結(jié)果。cv::circle和cv::putText這兩個函數(shù)如果鏈接的OpenCV模塊不全會直接報undefined reference所以它能幫我們快速確認-lopencv_imgproc這類鏈接參數(shù)有沒有配對。編譯命令對應(yīng)tasks.json里的寫法g -g -stdc17 -I C:/opencv/build/include -I C:/eigen-3.4.0 main.cpp -o main.exe -L C:/opencv/build/x64/mingw/lib -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_highgui運行后當前目錄下會出現(xiàn)output.png控制臺輸出特征值結(jié)果??吹竭@兩樣東西說明OpenCV和Eigen都配好了。6.3 用VsCode任務(wù)鏈自動化如果不想每次都在命令行敲一大串參數(shù)可以把tasks.json的第一個任務(wù)設(shè)成默認構(gòu)建任務(wù)以后按CtrlShiftB直接構(gòu)建。再配合一個運行任務(wù)用CtrlShiftB兩次完成“構(gòu)建運行”的操作鏈。在tasks.json里再增加一個任務(wù){(diào) label: run, type: shell, command: ./main.exe, dependsOn: build-opencv-eigen, problemMatcher: [] }這樣先按CtrlShiftB選“build-opencv-eigen”構(gòu)建完再按一次運行或者你自己改鍵位組合成一條流水線。7. 常見問題與排查技巧實錄7.1 報錯“fatal error: opencv2/opencv.hpp: No such file or directory”這個錯誤十有八九是編譯命令中的-Iinclude路徑不對或者OpenCV頭文件實際位置不是你想的那個。排查步驟檢查OpenCV安裝目錄下是否存在include/opencv2/opencv.hpp。用文件管理器看一眼比什么都強。確認tasks.json或CMakeLists.txt里的include路徑指向的是build/include而不是build。如果是用CMake先清理CMake緩存刪掉build目錄重新Configure避免舊的緩存指向錯誤路徑。7.2 報錯“undefined reference to cv::imread”或“undefined reference to Eigen::...”這類鏈接錯誤的殺傷力最大因為問題不在代碼本身而在鏈接階段。先說OpenCV的情況。undefined reference說明編譯器找到了頭文件聲明但找不到實現(xiàn)定義。原因幾乎都在庫名或庫路徑上-L路徑指向的目錄下沒有對應(yīng)庫文件。打開C:/opencv/build/x64/mingw/lib看看是不是有l(wèi)ibopencv_core460.dll.a這些文件。如果沒有說明你的預編譯包根本不是MinGW版。你鏈接的是VC版的庫x64/vc15/lib下面以.lib結(jié)尾的文件g完全不認識。這種情況必須換MinGW版OpenCV。庫名寫錯。比如預編譯包是libopencv_world460.dll.a但你寫的是-lopencv_core那自然找不到。Eigen的情況不同它是模板庫頭文件里全是實現(xiàn)正常情況下不會出現(xiàn)undefined reference。如果報Eigen相關(guān)鏈接錯誤往往是你同時用了非模板的實現(xiàn)比如unsupported目錄下的某些模塊或者編譯器版本太老模板實例化失敗。升級GCC版本到11以上基本能解決。7.3 編譯通過但運行時報“0xc000007b”0xc000007b這個錯誤碼的經(jīng)典含義是程序架構(gòu)或加載器版本不匹配在OpenCV配置中最常見的原因就是exe是64位的但加載的DLL是32位的或者反過來。排查方案確認你的g是64位版本。命令行執(zhí)行g(shù) -dumpmachine如果輸出x86_64-w64-mingw32則沒問題。確認OpenCV的bin目錄下的DLL和你下載的預編譯包架構(gòu)一致。解壓時不要選錯文件夾。如果你電腦上裝了另一個32位的MinGWPath里兩個bin目錄同時存在編譯器可能被舊版本搶先導致編譯出32位程序。檢查Path的順序把64位MinGW放在前面。7.4 IntelliSense和實際編譯結(jié)果不一致這種現(xiàn)象最讓人煩躁編輯器里顯示代碼一切正常編譯卻報錯誤或者編輯器里全紅波浪線編譯卻很順利。前面3.3節(jié)已經(jīng)解釋過原理這里補充一個具體操作。當出現(xiàn)不一致時打開命令面板輸入“C/C: Reset IntelliSense Database”重置后會重新加載配置。如果還是不行刪除.vscode目錄下的c_cpp_properties.json重新寫并把之前設(shè)置的includePath逐條確認。另外compilerPath也會影響IntelliSense對宏定義、系統(tǒng)庫鏈路的推測。比如g路徑寫錯了插件可能在解析opencv2/core.hpp時啟用錯誤的宏分支。確保compilerPath指向的g版本和tasks.json里的g是同一個。7.5 調(diào)試時斷點不生效或變量顯示異常斷點不生效一般是編譯優(yōu)化導致的。如果你在tasks.json的args里寫了-O2調(diào)試時建議去掉改用-O0加-g。優(yōu)化后的代碼指令順序和源碼不一致gdb調(diào)試時會產(chǎn)生跳來跳去、變量值被裁剪的感覺。如果變量窗口顯示optimized out這就是優(yōu)化引起的。把編譯命令改成g -g -O0 -stdc17 ...問題就會消失。另外Eigen的模板表達式非常復雜調(diào)試時一個變量的內(nèi)部結(jié)構(gòu)可能展開好幾層這是正常的不必擔心。7.6 在VsCode終端能編譯但雙擊exe打不開終端打開時能讀取系統(tǒng)Path中的DLL路徑雙擊exe走的是Windows圖形界面的Shell環(huán)境理論上讀取的是同樣的系統(tǒng)Path但有些情況下環(huán)境變量修改后沒有廣播到全局。解決方式重啟電腦或者重啟Windows資源管理器任務(wù)管理器里找到“Windows資源管理器”右鍵重啟。如果重啟都不行干脆把DLL復制到exe目錄下一勞永逸。7.7 常見問題速查表現(xiàn)象可能原因解決方向找不到opencv.hppinclude路徑錯誤檢查-I指向的具體目錄undefined reference庫名/庫路徑/lib類型不匹配確認mingw目錄、庫名是否對應(yīng)0xc000007b架構(gòu)不一致檢查64位工具鏈、DLL架構(gòu)找不到DLLPath未配置或未刷新配置Path后重啟VsCode或復制DLL調(diào)試無法單步編譯優(yōu)化導致改用-O0 -g編譯Eigen報模板錯誤GCC版本過舊升級MinGW-w64到最新版本CMake找不到OpenCVOpenCV_DIR錯誤指定到包含OpenCVConfig.cmake的目錄8. 從單工程配置到批量復用整理一套自己的模板配一次環(huán)境不難麻煩的是每新建一個項目都要重來一遍。我個人習慣是維護一套配置模板把.vscode整個目錄和CMakeLists.txt模板保存下來新建項目直接拷貝改一下項目名就行。具體操作在某個工作目錄下建一個template文件夾里面放好.vscode/c_cpp_properties.json.vscode/tasks.json.vscode/launch.jsonCMakeLists.txtmain.cpp帶一個能跑通的簡單OpenCVEigen示例每次新建工程復制這個模板目錄改掉工程名和源文件名刷新CMake緩存搞定。這個習慣還有一個好處如果你換了新電腦或者換了一個OpenCV版本只需要更新模板里的路徑配置不用一個個項目去查。8.1 關(guān)于版本號的一點提醒OpenCV 4.x和OpenCV 3.x在頭文件組織和庫名上有區(qū)別。4.x把很多模塊合并到了opencv_world中編譯時的鏈接參數(shù)會少一些。另外Eigen的CMake支持從3.3開始成熟如果你用3.2或更早版本在CMake里通過find_package(Eigen3)的方式配置時可能會遇到版本識別問題。建議保持Eigen版本在3.4以上。如果你下載的OpenCV預編譯包是4.8或4.9你會發(fā)現(xiàn)bin目錄下沒有單獨的opencv_core.dll而是有一個大的opencv_world480.dll。對應(yīng)的鏈接方式也要改成-lopencv_world。這個是在實際配置中很容易踩的坑照著老的教程寫-lopencv_core編譯死活說找不到。8.2 用VsCode任務(wù)配置替換掉命令行習慣用VsCode這幾年最大的體驗是把構(gòu)建、運行、調(diào)試都收進編輯器里精神狀態(tài)好很多。不需要來回切窗口不需要擔心命令行丟上下文。建議所有參數(shù)都收斂進.vscode目錄的三個json文件里以后不管是換電腦還是給別人演示幾分鐘就能復現(xiàn)環(huán)境。我見過不少同事配置環(huán)境時喜歡記命令行今天記一條明天記一條散落各處。等到要用的時候記不清參數(shù)只能上網(wǎng)重新搜。而把配置文檔化、模板化才是真正解決問題的思路。最后再分享一個小技巧配置完成后不要把main.exe、output.png這些構(gòu)建產(chǎn)物提交到代碼倉庫里在項目根目錄建一個.gitignore把.vscode/之外的生成文件都忽略掉。這樣別人克隆你的倉庫時拿到的是一套干凈的源碼和配置模板自己配一遍環(huán)境既練了手又避免了潛在沖突。