目集成)
1. 項(xiàng)目概述為什么要在Windows 10上編譯32位OpenCV如果你在Windows 10上做C開發(fā)尤其是涉及到一些老舊的工業(yè)軟件、特定的硬件SDK或者需要與一些只提供32位庫的第三方組件進(jìn)行鏈接時(shí)大概率會(huì)遇到一個(gè)頭疼的問題官方預(yù)編譯的OpenCV庫只有64位版本。直接從官網(wǎng)下載的OpenCV for Windows安裝包解壓后你會(huì)發(fā)現(xiàn)lib和bin目錄下清一色的vc14、vc15后綴對應(yīng)的是Visual Studio 2015和2017的64位運(yùn)行時(shí)。當(dāng)你嘗試在Visual Studio中創(chuàng)建一個(gè)Win32控制臺應(yīng)用項(xiàng)目并配置好包含目錄和庫目錄后一編譯就會(huì)報(bào)出一堆“LNK2019: 無法解析的外部符號”錯(cuò)誤。這是因?yàn)槟愕捻?xiàng)目是32位的卻在嘗試鏈接64位的庫就像想用一把六角扳手去擰十字螺絲根本對不上。所以自己動(dòng)手從源碼編譯一個(gè)32位的OpenCV庫就成了解決這個(gè)兼容性問題的唯一正解。這不僅僅是把平臺工具集從“x64”改成“Win32”那么簡單它涉及到一整套工具鏈的配置、編譯選項(xiàng)的調(diào)整以及編譯過程中可能遇到的各種“坑”。網(wǎng)上能找到的教程大多比較零散或者年代久遠(yuǎn)針對最新的OpenCV版本和Windows 10環(huán)境不一定完全適用。今天我就結(jié)合自己最近一次在Windows 10 22H2上使用Visual Studio 2022和CMake成功編譯OpenCV 4.8.0 32位庫的完整過程把每一步的操作、背后的原理以及踩過的坑都詳細(xì)記錄下來。無論你是需要對接32位的老系統(tǒng)還是單純想深入理解OpenCV的構(gòu)建過程這篇內(nèi)容都能給你一份可以直接“抄作業(yè)”的指南。2. 環(huán)境準(zhǔn)備與核心工具鏈解析編譯一個(gè)像OpenCV這樣的大型C項(xiàng)目穩(wěn)定的工具鏈?zhǔn)浅晒Φ囊话?。在Windows上這個(gè)工具鏈的核心就是“CMake Visual Studio 必要的支持庫”。下面我們來逐一拆解并解釋為什么這么選。2.1 編譯工具的選擇與配置1. Visual Studio 2022 (社區(qū)版即可)這是微軟最新的IDE我們主要用它強(qiáng)大的C編譯器和構(gòu)建系統(tǒng)。安裝時(shí)務(wù)必在“工作負(fù)載”中勾選“使用C的桌面開發(fā)”。這里有個(gè)關(guān)鍵點(diǎn)安裝程序默認(rèn)會(huì)同時(shí)安裝x64和x86的編譯工具鏈但為了確保萬無一失你可以在安裝摘要頁面點(diǎn)擊“單個(gè)組件”標(biāo)簽搜索并確認(rèn)“MSVC v143 - VS 2022 C x64/x86 生成工具”和對應(yīng)的“Windows SDK”都已選中。Visual Studio 2022自帶的MSVC編譯器版本如v143對C17/20標(biāo)準(zhǔn)支持更好能更順利地編譯OpenCV的現(xiàn)代C代碼。2. CMake (版本 3.20)CMake是一個(gè)跨平臺的構(gòu)建系統(tǒng)生成器。OpenCV使用CMake來管理其復(fù)雜的構(gòu)建配置。我們不需要用它的GUI命令行工具cmake.exe就足夠了。下載安裝后請務(wù)必將CMake的bin目錄例如C:\Program Files\CMake\bin添加到系統(tǒng)的PATH環(huán)境變量中。這樣你可以在任何命令行窗口直接調(diào)用cmake命令。高版本的CMake能更好地處理OpenCV的依賴查找和生成器配置。3. Python (可選但推薦安裝)OpenCV的Python綁定非常流行。如果你希望編譯出的庫也能用于Python需要安裝Python。建議從python.org下載3.8-3.11之間的64位版本注意這里是64位的Python解釋器與我們編譯32位的C庫不沖突。安裝時(shí)務(wù)必勾選“Add Python to PATH”。CMake在配置過程中會(huì)自動(dòng)尋找Python并生成cv2.pyd等Python擴(kuò)展模塊。注意這里容易混淆。我們編譯的是32位(x86)的C庫文件.lib, .dll。但安裝的Python解釋器可以是64位的。這是因?yàn)镻ython的擴(kuò)展模塊pyd本質(zhì)上是DLLCMake會(huì)根據(jù)找到的Python解釋器的架構(gòu)64位自動(dòng)為其編譯對應(yīng)架構(gòu)64位的cv2.pyd。這與你編譯32位的C主庫是并行不悖的兩件事。如果你也需要32位的Python綁定那就需要額外安裝一個(gè)32位的Python解釋器并用它重新配置編譯一次。2.2 源碼與依賴項(xiàng)獲取1. OpenCV 源碼從OpenCV GitHub倉庫的Releases頁面下載你需要的版本源碼包例如opencv-4.8.0.zip。建議選擇4.x的穩(wěn)定版本兼容性和社區(qū)支持都比較好。解壓到一個(gè)路徑中不含空格和中文的目錄比如D:\Dev\opencv-4.8.0。這是我們的源碼根目錄記為opencv_source。2. OpenCV Contrib 模塊 (可選)很多高級功能如SIFT、SURF、人臉識別等被放到了opencv_contrib倉庫中。如果你需要這些功能同樣去Releases頁面下載對應(yīng)版本的opencv_contrib-4.8.0.zip。解壓到類似D:\Dev\opencv_contrib-4.8.0的目錄記為contrib_source。在后續(xù)的CMake配置中你需要通過OPENCV_EXTRA_MODULES_PATH變量告訴CMake這個(gè)路徑。3. 第三方依賴庫FFmpeg 和 OpenEXROpenCV的視頻編解碼支持cv::VideoCapture依賴于FFmpeg。預(yù)編譯的32位FFmpeg開發(fā)庫并不好找。最省事的方法是讓CMake在配置時(shí)自動(dòng)下載但這需要穩(wěn)定的網(wǎng)絡(luò)環(huán)境。為了確保成功我們可以手動(dòng)準(zhǔn)備。訪問gyan.dev的FFmpeg構(gòu)建頁面下載針對Windows的“Release Builds”。你需要的是**32位通常標(biāo)注為“shared”或“win32”**的開發(fā)包。解壓后里面會(huì)有bin,include,lib文件夾。記住這個(gè)路徑。類似地High Dynamic Range圖像格式OpenEXR的支持也可能需要。你可以從GitHub的OpenEXR項(xiàng)目頁面尋找預(yù)編譯的32位庫或者同樣依賴CMake自動(dòng)下載。手動(dòng)準(zhǔn)備依賴庫的好處是編譯過程完全離線可控缺點(diǎn)是步驟繁瑣。對于首次編譯我建議先嘗試讓CMake自動(dòng)下載如果網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗再考慮手動(dòng)方式。3. CMake配置從源碼到VS工程的關(guān)鍵一步這是整個(gè)編譯過程中最核心、也最容易出錯(cuò)的一步。我們將使用CMake命令行工具將OpenCV的源碼轉(zhuǎn)換成一個(gè)Visual Studio 2022的解決方案.sln文件。3.1 創(chuàng)建并進(jìn)入構(gòu)建目錄不要在源碼目錄里直接構(gòu)建最佳實(shí)踐是創(chuàng)建一個(gè)獨(dú)立的構(gòu)建目錄build。這樣做的好處是保持源碼目錄的純凈方便進(jìn)行多種不同配置的編譯比如Debug/Release帶contrib/不帶contrib。# 打開CMD或PowerShell進(jìn)入你的工作目錄 D: cd \Dev mkdir opencv-4.8.0-build-x86 cd opencv-4.8.0-build-x86現(xiàn)在你的opencv_source在D:\Dev\opencv-4.8.0構(gòu)建目錄build_dir是D:\Dev\opencv-4.8.0-build-x86。3.2 執(zhí)行CMake配置命令下面這條命令是配置的骨架請根據(jù)你的實(shí)際情況替換路徑和選項(xiàng)cmake ^ -G Visual Studio 17 2022 ^ -A Win32 ^ -D CMAKE_BUILD_TYPERelease ^ -D BUILD_opencv_worldON ^ -D OPENCV_EXTRA_MODULES_PATHD:/Dev/opencv_contrib-4.8.0/modules ^ -D WITH_FFMPEGON ^ -D BUILD_EXAMPLESOFF ^ -D BUILD_TESTSOFF ^ -D BUILD_PERF_TESTSOFF ^ -D BUILD_DOCSOFF ^ -D INSTALL_C_EXAMPLESOFF ^ -D INSTALL_PYTHON_EXAMPLESOFF ^ -D OPENCV_ENABLE_NONFREEOFF ^ -D CMAKE_INSTALL_PREFIXD:/Dev/opencv-4.8.0-install-x86 ^ D:/Dev/opencv-4.8.0逐行解析關(guān)鍵參數(shù)-G “Visual Studio 17 2022”: 指定生成器為VS 2022。CMake會(huì)根據(jù)這個(gè)生成器創(chuàng)建.sln文件。-A Win32:這是編譯32位庫的關(guān)鍵-A指定目標(biāo)平臺架構(gòu)Architecture。Win32即代表32位x86。如果省略默認(rèn)會(huì)生成x64的工程。-D CMAKE_BUILD_TYPERelease: 在單配置生成器如Makefile中指定構(gòu)建類型。對于多配置的VS生成器這個(gè)參數(shù)依然會(huì)影響一些編譯器的默認(rèn)標(biāo)志。我們通常分別編譯Debug和Release這里先以Release為例。-D BUILD_opencv_worldON:強(qiáng)烈建議開啟。這個(gè)選項(xiàng)會(huì)將除少數(shù)模塊如python3外的所有OpenCV功能編譯到單個(gè)巨型庫文件opencv_world480.lib和opencv_world480.dll中。對于開發(fā)者來說這意味著在項(xiàng)目配置時(shí)只需要鏈接這一個(gè)world庫極大簡化了依賴管理。否則你需要鏈接opencv_core、opencv_imgproc等幾十個(gè)單獨(dú)的庫文件。-D OPENCV_EXTRA_MODULES_PATH...: 如果你下載了opencv_contrib通過這個(gè)變量指定其modules子目錄的路徑。CMake會(huì)將這些額外模塊納入構(gòu)建。-D WITH_FFMPEGON: 啟用FFmpeg支持用于視頻讀寫。-D BUILD_EXAMPLESOFF等: 關(guān)閉示例、測試、文檔的構(gòu)建可以顯著縮短編譯時(shí)間。首次編譯成功后你可以再開啟它們進(jìn)行學(xué)習(xí)。-D CMAKE_INSTALL_PREFIX...: 指定安裝目錄。編譯完成后執(zhí)行INSTALL項(xiàng)目時(shí)生成的頭文件、庫文件等都會(huì)復(fù)制到這個(gè)目錄方便后續(xù)開發(fā)引用。路徑中不要有空格。執(zhí)行這條命令后CMake會(huì)開始運(yùn)行。它會(huì)檢測你的編譯器、查找依賴如FFmpeg、Python。這個(gè)過程可能會(huì)持續(xù)幾分鐘期間會(huì)輸出大量檢測信息。3.3 處理配置過程中的常見問題問題1FFmpeg下載失敗或找不到。這是最常見的問題。CMake輸出中會(huì)出現(xiàn)FFMPEG: Download:的提示然后卡住或報(bào)錯(cuò)。解決方案A推薦如果網(wǎng)絡(luò)尚可可以多試幾次。有時(shí)是服務(wù)器響應(yīng)慢。解決方案B手動(dòng)下載。根據(jù)CMake輸出中給出的具體URL如ffmpeg_version.cmake文件中的鏈接用瀏覽器或下載工具下載對應(yīng)的ffmpeg和opencv_videoio_ffmpeg.dll等文件并手動(dòng)放置到構(gòu)建目錄下的.cache/ffmpeg文件夾中CMake會(huì)自動(dòng)創(chuàng)建這個(gè)緩存目錄。然后重新運(yùn)行CMake命令它會(huì)發(fā)現(xiàn)緩存文件中已存在跳過下載。解決方案C完全離線。如前所述手動(dòng)下載32位FFmpeg開發(fā)包然后在CMake命令中通過-D FFMPEG_DIRD:/path/to/your/ffmpeg-dev變量直接指定其路徑。問題2Python相關(guān)警告??赡軙?huì)提示Python3 not found或者找到的Python版本不是你想要的。如果你不需要Python綁定可以忽略。如果需要請確保Python已正確安裝并添加到PATH。你可以通過-D Python3_EXECUTABLEC:/path/to/python.exe來強(qiáng)制指定Python解釋器路徑。問題3紅色錯(cuò)誤Error。如果最后出現(xiàn)Configuring incomplete, errors occurred!一定要向上滾動(dòng)查看具體的錯(cuò)誤信息。常見原因包括路徑錯(cuò)誤、依賴缺失、權(quán)限不足嘗試不要在C盤Program Files目錄下構(gòu)建、CMake版本與源碼不兼容等。根據(jù)錯(cuò)誤信息搜索解決。當(dāng)CMake最終輸出Configuring done和Generating done并且沒有紅色錯(cuò)誤時(shí)恭喜你配置成功在build_dir下會(huì)生成一個(gè)巨大的OpenCV.sln解決方案文件。4. Visual Studio編譯與安裝配置完成后剩下的就是體力活了——使用Visual Studio進(jìn)行編譯和安裝。4.1 編譯Release版本用Visual Studio 2022打開生成的OpenCV.sln。在頂部的解決方案配置下拉框中選擇Release。在解決方案平臺下拉框中確認(rèn)是Win32。在右側(cè)的“解決方案資源管理器”中找到CMakeTargets文件夾下的ALL_BUILD項(xiàng)目右鍵點(diǎn)擊選擇“生成”。接下來就是漫長的等待。編譯整個(gè)OpenCV含contrib可能需要30分鐘到2小時(shí)取決于你的CPU性能。你可以觀察“輸出”窗口查看編譯進(jìn)度。實(shí)操心得編譯過程中可能會(huì)遇到一些警告C4996等提示某些函數(shù)不安全或被棄用這通常不影響庫的生成。但如果遇到編譯錯(cuò)誤C1083無法打開源文件、LNK2001無法解析的外部符號等大概率是依賴問題或源碼損壞。首先嘗試清理Build - Clean Solution后重新生成。如果問題依舊回到CMake配置步驟檢查相關(guān)依賴如FFmpeg是否真的配置成功。4.2 編譯Debug版本Debug庫用于調(diào)試程序它包含符號信息體積更大運(yùn)行速度慢。在解決方案配置下拉框中切換到Debug。再次右鍵點(diǎn)擊ALL_BUILD項(xiàng)目選擇“重新生成”。等待編譯完成。現(xiàn)在你的build_dir\lib\Debug和build_dir\lib\Release目錄下應(yīng)該分別有了opencv_world480d.libDebug版和opencv_world480.libRelease版等庫文件。bin\Debug和bin\Release下則有對應(yīng)的.dll文件。4.3 執(zhí)行安裝Install編譯生成的文件散落在構(gòu)建目錄的各個(gè)子文件夾里。為了方便我們自己的項(xiàng)目使用需要將它們集中復(fù)制到一個(gè)標(biāo)準(zhǔn)的目錄結(jié)構(gòu)下這就是“安裝”。確保解決方案配置是Release。在“解決方案資源管理器”中找到CMakeTargets下的INSTALL項(xiàng)目。右鍵點(diǎn)擊INSTALL選擇“僅用于項(xiàng)目 - 僅生成INSTALL”。Visual Studio會(huì)執(zhí)行一個(gè)“構(gòu)建后”步驟將必要的頭文件.hpp、庫文件.lib、動(dòng)態(tài)庫.dll以及CMake配置文件復(fù)制到你之前在CMake中指定的CMAKE_INSTALL_PREFIX目錄例如D:\Dev\opencv-4.8.0-install-x86。安裝完成后檢查安裝目錄你會(huì)看到清晰的include、lib、bin等文件夾。這個(gè)目錄就是未來你在自己項(xiàng)目中要引用的OpenCV開發(fā)環(huán)境。5. 在新項(xiàng)目中測試與配置32位OpenCV庫庫編譯好了怎么用才是關(guān)鍵。我們來創(chuàng)建一個(gè)最簡單的Visual Studio 2022 Win32控制臺應(yīng)用項(xiàng)目測試一下。5.1 創(chuàng)建測試項(xiàng)目并配置屬性打開VS2022創(chuàng)建新項(xiàng)目 - “控制臺應(yīng)用” - 項(xiàng)目名稱OpenCVTest- 在“其他信息”頁面將“目標(biāo)平臺”選擇為x86。在“解決方案資源管理器”中右鍵項(xiàng)目名選擇“屬性”。確保右上角的“配置”是“所有配置”“平臺”是“Win32”。這樣一次修改能同時(shí)應(yīng)用于Debug和Release。配置包含目錄頭文件路徑在“C/C” - “常規(guī)” - “附加包含目錄”中添加你的OpenCV安裝目錄下的include子目錄。例如D:\Dev\opencv-4.8.0-install-x86\include配置庫目錄.lib文件路徑在“鏈接器” - “常規(guī)” - “附加庫目錄”中添加OpenCV安裝目錄下的lib子目錄。例如D:\Dev\opencv-4.8.0-install-x86\lib配置動(dòng)態(tài)庫目錄.dll文件路徑可選但推薦在“調(diào)試” - “環(huán)境”中添加PATH環(huán)境變量值為OpenCV安裝目錄下的bin目錄。例如PATHD:\Dev\opencv-4.8.0-install-x86\bin;%PATH%這樣做的好處是在VS中啟動(dòng)調(diào)試時(shí)系統(tǒng)能自動(dòng)找到運(yùn)行所需的DLL。否則你需要手動(dòng)將DLL復(fù)制到你的項(xiàng)目.exe文件旁邊。指定鏈接的庫文件在“鏈接器” - “輸入” - “附加依賴項(xiàng)”中添加你要鏈接的庫文件名。對于Release配置在屬性頁頂部切換添加opencv_world480.lib對于Debug配置添加opencv_world480d.lib如果你沒有開啟BUILD_opencv_world則需要添加一長串庫如opencv_core480.lib;opencv_imgproc480.lib;opencv_highgui480.lib;...非常麻煩。5.2 編寫并運(yùn)行測試代碼在項(xiàng)目的main.cpp中寫入一段簡單的OpenCV代碼#include opencv2/opencv.hpp #include iostream int main() { // 創(chuàng)建一個(gè)黑色的空白圖像 cv::Mat image cv::Mat::zeros(cv::Size(640, 480), CV_8UC3); // 在圖像上畫一個(gè)紅色的圓 cv::circle(image, cv::Point(320, 240), 100, cv::Scalar(0, 0, 255), -1); // 顯示圖像 cv::imshow(Test OpenCV 32-bit, image); // 等待按鍵 cv::waitKey(0); // 打印OpenCV版本信息 std::cout Build with OpenCV CV_VERSION std::endl; return 0; }選擇“Debug x86”或“Release x86”配置點(diǎn)擊運(yùn)行。如果一切配置正確你應(yīng)該能看到一個(gè)顯示紅色圓圈的窗口并在控制臺輸出OpenCV版本號。這證明你的32位OpenCV庫已經(jīng)成功鏈接并運(yùn)行。6. 深度排坑與性能優(yōu)化指南即使按照步驟操作你也可能遇到一些奇怪的問題。這里匯總了一些典型問題及其解決方案。6.1 編譯期與鏈接期問題排查問題編譯時(shí)找不到opencv2/opencv.hpp等頭文件。檢查項(xiàng)目屬性中“附加包含目錄”的路徑是否正確路徑中是否使用了反斜杠\應(yīng)使用正斜杠/或保持默認(rèn)。確保路徑指向的是include目錄而不是include/opencv2。問題鏈接時(shí)報(bào)告“LNK2019: 無法解析的外部符號cv::imshow(...)”等錯(cuò)誤。檢查1“附加依賴項(xiàng)”中填寫的庫文件名是否正確Debug和Release配置是否區(qū)分開了帶d后綴的是Debug庫檢查2“附加庫目錄”的路徑是否正確是否指向了包含.lib文件的目錄檢查3你鏈接的庫文件如opencv_world480.lib是否確實(shí)存在于你指定的庫目錄中可能是編譯或安裝步驟失敗了。檢查4你的項(xiàng)目平臺Win32/x86是否與庫的平臺匹配用64位的項(xiàng)目去鏈接32位的庫必然失敗。問題程序運(yùn)行時(shí)崩潰提示“找不到opencv_world480.dll”或“應(yīng)用程序無法正常啟動(dòng)(0xc000007b)”。檢查10xc000007b錯(cuò)誤通常意味著架構(gòu)不匹配。即你的程序是32位的卻加載了64位的DLL或者反之。請確認(rèn)你的項(xiàng)目生成的是x86/Win32目標(biāo)。你系統(tǒng)PATH環(huán)境變量中或者你的程序運(yùn)行目錄下存在的opencv_world480.dll是32位版本。可以用Dependency Walker或dumpbin /headers opencv_world480.dll命令查看DLL的機(jī)器類型顯示x86才是對的。檢查2所有依賴的DLL如opencv_videoio_ffmpeg480_64.dll注意如果編譯了FFmpeg支持會(huì)有這個(gè)是否都存在于程序可訪問的路徑下如bin目錄或系統(tǒng)PATH。32位程序依賴的DLL也必須是32位的。6.2 針對32位環(huán)境的特殊優(yōu)化考量32位程序受限于4GB的虛擬地址空間實(shí)際用戶態(tài)可用約2-3GB。在處理超大圖像或視頻時(shí)更容易遇到內(nèi)存不足的問題。優(yōu)化建議1管理圖像生命周期及時(shí)釋放不再使用的cv::Mat對象通過.release()或讓其離開作用域。避免在循環(huán)中無節(jié)制地創(chuàng)建大圖像而不釋放。優(yōu)化建議2使用cv::UMat透明APIOpenCV的UMat可以利用OpenCL或Intel IPP等硬件加速并且數(shù)據(jù)可以存儲(chǔ)在共享內(nèi)存或顯存中有時(shí)能緩解主內(nèi)存壓力。但需要注意其上下文管理和數(shù)據(jù)同步的開銷。優(yōu)化建議3流式處理對于視頻或圖像序列采用“讀取-處理-寫入-釋放”的流水線避免將所有幀同時(shí)保存在內(nèi)存中。編譯優(yōu)化在CMake配置時(shí)可以開啟-D ENABLE_AVX2OFF。因?yàn)橐恍┡f的32位CPU可能不支持AVX2指令集強(qiáng)制開啟會(huì)導(dǎo)致運(yùn)行時(shí)非法指令錯(cuò)誤。對于32位環(huán)境保守起見可以關(guān)閉這些高級指令集優(yōu)化。6.3 與第三方32位庫的集成你的項(xiàng)目可能還需要鏈接其他32位的第三方庫例如一個(gè)32位的硬件采集卡SDK。庫順序問題在“附加依賴項(xiàng)”中將OpenCV的庫如opencv_world480.lib放在其他第三方庫的后面。鏈接器按順序解析未定義的符號將基礎(chǔ)庫放在后面是通用規(guī)則。運(yùn)行時(shí)庫沖突確保所有庫你的OpenCV、第三方SDK都是用相同或兼容的運(yùn)行時(shí)庫如/MD或/MDd編譯的。你可以在編譯OpenCV時(shí)通過CMake變量-D CMAKE_MSVC_RUNTIME_LIBRARY來指定通常保持默認(rèn)的“Multi-threaded DLL (/MD)”即可這與Visual Studio新建項(xiàng)目的默認(rèn)設(shè)置一致。路徑管理當(dāng)有多個(gè)第三方DLL時(shí)妥善管理PATH環(huán)境變量或直接將所有必需的32位DLL復(fù)制到你的程序輸出目錄下是最穩(wěn)妥的做法。整個(gè)過程從工具準(zhǔn)備、源碼配置、編譯安裝到項(xiàng)目集成雖然步驟不少但每一步都有其明確的目的。自己編譯32位OpenCV庫不僅能解決特定的兼容性需求更能讓你對庫的構(gòu)成和依賴關(guān)系有更深的理解。當(dāng)你的程序最終在32位的老工控機(jī)上穩(wěn)定讀取攝像頭并處理圖像時(shí)你會(huì)覺得這一切的折騰都是值得的。如果在實(shí)踐中遇到上面沒覆蓋到的問題多查看CMake的輸出信息和編譯錯(cuò)誤日志那里面通常藏著解決問題的鑰匙。