錯:msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set 的成因與解決方案)
“msvc-version.conf loaded but QMAKE_MSC_VER isnt set”這行字凡是拿 Qt 在 Windows 上做過 MSVC 編譯的老哥多少都撞見過至少一次。我第一次碰到的時(shí)候整個人是懵的項(xiàng)目代碼一行沒改qmake 突然就撂挑子報(bào)錯信息里既沒有具體文件路徑也沒有行號就一句“配置加載了但變量沒設(shè)置”我當(dāng)時(shí)還以為是自己把某個 .pro 文件改壞了。后來在 Qt 源碼和 qmake 的 mkspec 機(jī)制里翻了一陣又連續(xù)折騰了幾天才把這個問題真正吃透。它本質(zhì)上不是你的代碼寫錯了而是 qmake 在加載 MSVC 工具鏈配置時(shí)沒有拿到它預(yù)期的“編譯器版本信息”。今天就把這個報(bào)錯的來龍去脈、背后機(jī)制和幾種解決辦法完整梳理一遍給同樣被它卡住的人一條直路走。1. 報(bào)錯現(xiàn)象與觸發(fā)場景1.1 你看到的報(bào)錯長什么樣這個報(bào)錯通常出現(xiàn)在執(zhí)行 qmake 生成 Makefile 的階段而不是編譯階段。典型輸出如下$ qmake your_project.pro msvc-version.conf loaded but QMAKE_MSC_VER isnt set有些情況下它只是作為警告打印出來然后構(gòu)建繼續(xù)但更多時(shí)候后續(xù)會出現(xiàn)“unknown msvc version”之類的錯誤或者生成的 Makefile 里編譯器版本標(biāo)識是空的直接導(dǎo)致編譯失敗。你在命令行、Qt Creator 的構(gòu)建輸出窗口、CI 腳本里都能看到它。1.2 什么場景最容易觸發(fā)根據(jù)我實(shí)際接觸過的案例這個報(bào)錯高頻出現(xiàn)在以下三種環(huán)境里場景一自己下載了 Qt 源碼包編譯 Qt 庫本身。官方源碼包里 mkspecs 目錄下有一堆平臺相關(guān)的 spec你如果手滑用了 win32-msvc 相關(guān)的 spec但沒先進(jìn)入 MSVC 的命令行環(huán)境qmake 就沒法探測到 MSVC 版本。場景二用非官方路徑或自定義 mkspec 構(gòu)建項(xiàng)目。有些項(xiàng)目喜歡把 mkspecs 單獨(dú)拷貝出來做定制拷貝后 msvc-version.conf 文件是有了但里面的變量沒被正確展開。場景三在干凈的終端里直接跑 qmake。沒有先調(diào)用 vcvarsall.bat 或 vcvars64.bat 初始化 MSVC 環(huán)境變量這是最常見的。Windows 上和 Linux 不一樣MSVC 的編譯器版本信息不會自動出現(xiàn)在全局環(huán)境變量里必須依賴特定腳本設(shè)置。我還見過一種比較隱蔽的場景項(xiàng)目里同時(shí)存在 MinGW 版和 MSVC 版的 Qt用戶 PATH 環(huán)境變量里先命中了 MinGW 的 qmake卻硬要用 MSVC 的 mkspec這時(shí)候也會彈這個錯。1.3 這個問題影響的用戶范圍只要你在 Windows 上用 MSVC 工具鏈配合 qmake 構(gòu)建 Qt 項(xiàng)目無論 Qt 版本是 5.x 還是 6.x都有可能碰到。OpenSSL、QGIS、一些工業(yè)軟件插件、以及大量使用 qmake 作為構(gòu)建系統(tǒng)的 C 項(xiàng)目都會踩中。2. 根因剖析qmake 為什么找不到 MSVC 版本信息2.1 揭開 msvc-version.conf 的真面目要理解這個報(bào)錯得先知道 qmake 在 Windows 上是怎么確定“當(dāng)前在用哪個版本的 MSVC”的。它在處理 mkspec 時(shí)會去加載一個叫 msvc-version.conf 的配置文件這個文件在 Qt 的 mkspecs 目錄里常見路徑是Qt/5.15.2/msvc2019_64/mkspecs/common/msvc-version.conf或者Qt/6.5.0/msvc2019_64/mkspecs/common/msvc-version.conf這個文件里面的內(nèi)容非常簡短本質(zhì)上就是定義一個變量告訴 qmake 當(dāng)前 MSVC 的主版本號。比如這個文件內(nèi)容可能是QMAKE_MSC_VER 1929注意1929 對應(yīng)的是 Visual Studio 2019 的 14.29 版本工具鏈。為什么要單獨(dú)用一個文件來記錄因?yàn)橥粋€ VS 版本的不同更新比如 VS2019 的 16.8 和 16.11Cl.exe 的版本號會變qmake 需要知道精確的版本號來決定某些編譯選項(xiàng)和行為。它不像 GCC 那樣可以通過“gcc --version”直接拿到穩(wěn)定輸出MSVC 的 cl.exe 返回的版本信息比較原始需要一層映射而這個映射關(guān)系就在 msvc-version.conf 里。簡單比喻一下qmake 就是個裝修包工頭msvc-version.conf 是他的小本本上記的“客戶家裝修材料的批次號”。他進(jìn)場施工前要翻一下這個小本本確認(rèn)材料批次才能調(diào)用對應(yīng)的施工工藝。結(jié)果他翻開本子發(fā)現(xiàn)這一頁是空白的——“QMAKE_MSC_VER isnt set”當(dāng)場傻眼。2.2 “l(fā)oaded”和“isnt set”分別指什么報(bào)錯原文是“msvc-version.conf loaded but QMAKE_MSC_VER isnt set”拆開理解就清楚了loadedqmake 確實(shí)找到了 msvc-version.conf 文件也讀取了它。QMAKE_MSC_VER isnt set但這個文件的內(nèi)容里沒有設(shè)置 QMAKE_MSC_VER 這個變量或者設(shè)置值為空。為什么文件存在卻沒設(shè)置變量幾種可能文件內(nèi)容被意外清空或損壞里面只剩注釋沒有實(shí)際的賦值行。qmake 讀取的路徑不對它加載的是一個錯誤位置的同名文件這個文件里沒有定義該變量。環(huán)境變量 QMAKE_MSC_VER 沒有被預(yù)先設(shè)置而 msvc-version.conf 又依賴于外部傳入。在 Qt 自舉bootstrap或者某些自定義構(gòu)建流程里qmake 期望從系統(tǒng)環(huán)境中拿到這個值沒拿到就報(bào)錯。這里有個關(guān)鍵點(diǎn)qmake 在 MSVC 下的 mkspec 處理邏輯里會先檢查外部環(huán)境變量 QMAKE_MSC_VER如果外部環(huán)境沒設(shè)置就嘗試從 msvc-version.conf 文件里讀。兩個來源都沒有時(shí)就打印這個錯誤。而在正常的 VS 開發(fā)命令行里vcvarsall.bat 會把一些必要的環(huán)境信息設(shè)置好同時(shí) msvc-version.conf 里也有默認(rèn)值兜底兩者配合正常路徑下你根本看不到這個錯。2.3 為什么 VS 命令行里沒事自己開終端就報(bào)錯這是很多人的困惑點(diǎn)在“x64 Native Tools Command Prompt for VS 2022”里運(yùn)行 qmake 一切正常但自己按 WinR 輸入 cmd 打開個黑窗口執(zhí)行同樣的命令就報(bào)錯。原因在于VS 的“開發(fā)者命令行提示符”啟動時(shí)自動執(zhí)行了 vcvarsall.bat或者 vcvars64.bat這個腳本設(shè)置了大量環(huán)境變量其中包括VSINSTALLDIR VCINSTALLDIR WindowsSdkDir LIB INCLUDE其中一個很關(guān)鍵的變量就是 QMAKE_MSC_VER 或與之相關(guān)的編譯器版本探測依據(jù)。你自己開的 cmd 窗口則什么都沒設(shè)置qmake 拿不到 MSVC 的環(huán)境信息于是走了 msvc-version.conf 這條路徑一旦這個文件再出點(diǎn)問題就立刻上演“l(fā)oaded but isnt set”。這就像你叫了個外賣外賣員到了你家樓下但你家的門牌號沒有寫清楚。在開發(fā)者命令行里你已經(jīng)提前把門牌號塞給他了在裸終端里他只能翻你家的信箱msvc-version.conf結(jié)果信箱里也是空的。2.4 QMAKE_MSC_VER 與 _MSC_VER 的關(guān)系需要順帶澄清一個容易混淆的概念QMAKE_MSC_VER 是 qmake 的變量屬于 Qt 構(gòu)建系統(tǒng)的配置項(xiàng)而 _MSC_VER 是 MSVC 編譯器預(yù)定義的宏由 cl.exe 自動定義。兩者數(shù)值含義一致比如你寫代碼時(shí)用 #ifdef _MSC_VER 判斷編譯器用MSC_VER 1929 判斷具體版本。qmake 里為了保持與編譯器行為一致就沿用了這個命名只是加了個 QMAKE前綴表示是它自己的配置。3. 解決辦法詳解從臨時(shí)繞過到徹底根治3.1 方法一進(jìn)入 MSVC 開發(fā)環(huán)境再執(zhí)行 qmake最推薦這是最直接、也是最符合 Qt 設(shè)計(jì)預(yù)期的方法。不要自己裸開 cmd 跑 qmake而是用 VS 提供的開發(fā)命令行或者手動調(diào)用 vcvars 腳本。如果你是 VS2022可以直接從開始菜單打開“x64 Native Tools Command Prompt for VS 2022”。這個快捷方式本質(zhì)是執(zhí)行了call C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat當(dāng)然你的 VS 安裝路徑可能不同如果是 Professional 或 Enterprise 版路徑里的 Community 要替換成對應(yīng)版本名。當(dāng)你需要在自動化腳本或 CI 流程里復(fù)現(xiàn)這個環(huán)境時(shí)就不能依賴手動打開窗口了得在批處理開頭顯式寫入這行 call 命令call C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat注意區(qū)別在于 BuildTools 路徑你如果只裝了“生成工具”而不是完整 VS要認(rèn)準(zhǔn)這個目錄。執(zhí)行完 vcvars64.bat 后再運(yùn)行 qmake 就不會報(bào)這個錯了。原理很簡單vcvars 腳本會把 VS 安裝路徑、SDK 版本、編譯器的 include/lib 路徑全部注入當(dāng)前會話qmake 可以據(jù)此準(zhǔn)確探測 MSVC 版本。這個方法對 Qt 5 和 Qt 6 都有效凡是用官方預(yù)編譯的 Qt MSVC 版本搭配官方 mkspecs只要先進(jìn) VS 開發(fā)環(huán)境問題就消失。3.2 方法二手動設(shè)置 QMAKE_MSC_VER 環(huán)境變量如果你因?yàn)槟承┰驘o法使用 VS 開發(fā)命令行比如你在 IDE 里自定義了構(gòu)建步驟或者你用的是自定義終端可以手動設(shè)置 QMAKE_MSC_VER 環(huán)境變量把它指到當(dāng)前使用的 MSVC 版本號。以 VS2022 為例在 cmd 窗口里執(zhí)行set QMAKE_MSC_VER1930在 PowerShell 里則是$env:QMAKE_MSC_VER1930執(zhí)行完之后再跑 qmake報(bào)錯會消失。這里要注意版本號的對應(yīng)關(guān)系不同 VS 版本對應(yīng)的 QMAKE_MSC_VER 值如下Visual Studio 版本工具集版本QMAKE_MSC_VER 參考值VS2015v1401900VS2017v1411910~1914VS2019v1421920~1929VS2022v1431930~1939為什么 VS2017 之后是一個范圍而不是固定值因?yàn)槲④浽?VS2017 之后采用了“工具集可獨(dú)立更新”的機(jī)制同一個 VS 版本可以裝不同小版本號的編譯器比如 VS2019 的 16.11 版本對應(yīng) 1929而早期 16.0 對應(yīng) 1920。qmake 需要的是一個具體值不是范圍。手動設(shè)置環(huán)境變量的方法雖然能消除報(bào)錯但我不建議作為長期方案因?yàn)榄h(huán)境變量容易“漂移”。比如你機(jī)器上裝了多個 VS 版本或同事的腳本里把這個變量寫死了換到 VS2022 環(huán)境下就成了舊值反而可能引發(fā)編譯選項(xiàng)不匹配的詭異問題。3.3 方法三檢查并修復(fù) msvc-version.conf 文件如果前兩種方法都試了還是報(bào)錯那就得懷疑 msvc-version.conf 本身的問題了。這個文件路徑通常在Qt安裝目錄/版本/編譯套件/mkspecs/common/msvc-version.conf比如D:\Qt\5.15.2\msvc2019_64\mkspecs\common\msvc-version.conf用文本編輯器打開它正常內(nèi)容應(yīng)該是類似QMAKE_MSC_VER 1929或者在某些 Qt 版本里還會附帶檢測邏輯比如根據(jù)環(huán)境變量或編譯器路徑來推導(dǎo)。但核心必須有一行 QMAKE_MSC_VER 的賦值。如果你打開發(fā)現(xiàn)文件是空白的或者只有注釋沒有賦值行就說明它壞了。修復(fù)方法很簡單把正確版本號寫回去。比如你是 VS2022 的 Qt 6.5.0就寫QMAKE_MSC_VER 1930保存后重新執(zhí)行 qmake。但這里還有一個更隱蔽的情況qmake 加載的 msvc-version.conf 可能不是你以為的那個路徑。qmake 的 mkspec 解析是分層的它會先加載父級 spec如 common/msvc.conf再加載平臺相關(guān) spec如 win32-msvc.conf最后再加載版本相關(guān)文件。如果你通過 QMAKESPEC 環(huán)境變量或 .qmake.conf 文件人為指定了其他位置的 spec就可能繞開標(biāo)準(zhǔn)路徑加載到一個來自第三方 SDK 或舊項(xiàng)目殘留的 msvc-version.conf。提示排查時(shí)務(wù)必先執(zhí)行qmake -query QMAKE_MKSPECS查看實(shí)際生效的 mkspecs 路徑再逐個檢查該路徑下的 common 和 win32-msvc 子目錄確認(rèn)所有 msvc-version.conf 文件內(nèi)容都正常。這個思路能避免你修復(fù)了 A 路徑的文件但 qmake 實(shí)際加載的是 B 路徑的文件。3.4 方法四清理構(gòu)建緩存強(qiáng)制重新配置有時(shí)候 qmake 之前已經(jīng)成功生成過 Makefile但后來你的環(huán)境發(fā)生了變化比如 VS 更新、Qt 版本切換、環(huán)境變量變更qmake 會讀取舊緩存里的配置信息導(dǎo)致新加載的 msvc-version.conf 與緩存信息不一致從而觸發(fā)這個報(bào)錯。解決辦法是徹底清理構(gòu)建中間文件強(qiáng)制 qmake 重新探測一切。在項(xiàng)目根目錄下執(zhí)行make distclean或者手動刪除以下文件再重新 qmakeMakefile .qmake.stash .debug/ .release/.qmake.stash是 qmake 緩存配置信息的文件它記錄了上一次 qmake 運(yùn)行時(shí)的很多探測結(jié)果。如果它記錄的是舊的 QMAKE_MSC_VER而當(dāng)前環(huán)境的 msvc-version.conf 又被更新過兩邊對不上就可能出現(xiàn)“l(fā)oaded but isnt set”這種半吊子狀態(tài)。我遇到過好幾次這種情況環(huán)境確實(shí)沒問題、文件也確實(shí)有內(nèi)容但就是報(bào)錯。最后發(fā)現(xiàn)是.qmake.stash太舊了刪除后重新 qmake 就一切正常了。3.5 方法五修改 mkspec 強(qiáng)制指定特定場景的非常規(guī)手段如果以上方法全都不適用于你的場景比如你在一個受限的 CI 環(huán)境里既不能調(diào)用 vcvars也不能改系統(tǒng)環(huán)境變量還有一個“非常規(guī)但有效”的辦法直接修改項(xiàng)目使用的 mkspec 文件強(qiáng)制把 QMAKE_MSC_VER 寫死。找到項(xiàng)目實(shí)際使用的 mkspec 路徑下的 msvc-version.conf比如標(biāo)準(zhǔn)路徑win32-msvc\msvc-version.conf在這個文件里顯式添加QMAKE_MSC_VER 1930這樣 qmake 加載這個文件時(shí)就能拿到變量值不會再報(bào)錯。不過我非常不建議把這個方法作為默認(rèn)方案去推廣因?yàn)樗茐牧?Qt 構(gòu)建系統(tǒng)的自動探測邏輯。你硬編碼了一個版本號以后如果機(jī)器上換了別的 VS 版本這個值不會跟著變等于把定時(shí)炸彈埋在了項(xiàng)目里。我踩過這個坑某次在 CI 機(jī)器上硬編碼了 1929后來 CI 升級 VS2022 之后編譯出的二進(jìn)制在某些系統(tǒng)上運(yùn)行異?;税胩觳排挪槌鰡栴}根因。這個方案只適合“構(gòu)建環(huán)境完全鎖死、永遠(yuǎn)不會升級”的場景。如果有任何變動的可能性還是回到方案一和方案二去。4. 常見排查清單與避坑指南4.1 一頁紙速查表現(xiàn)場癥狀大概率原因首選修法裸終端運(yùn)行 qmake 報(bào)錯未初始化 MSVC 環(huán)境調(diào)用 vcvars64.bat 或使用 VS 開發(fā)命令行vs 命令行里運(yùn)行正常CI 腳本里報(bào)錯CI 腳本缺少 vcvars 初始化在 CI 腳本開頭 call vcvars64.bat報(bào)錯后 Makefile 生成了但編譯失敗QMAKE_MSC_VER 為空導(dǎo)致編譯器參數(shù)錯誤手動 set QMAKE_MSC_VERqt 項(xiàng)目之前正常今天突然報(bào)錯VS 或 Qt 工具鏈更新導(dǎo)致緩存失效刪除 .qmake.stash 后重新 qmake自定義 mkspec 后報(bào)錯新 mkspec 缺少 msvc-version.conf補(bǔ)全 mkspec 的 conf 文件多個 Qt 套件并存時(shí)報(bào)錯qmake 與 mkspec 不匹配檢查 PATH 與 QMAKESPEC鎖定目標(biāo)套件4.2 最容易踩的兩個坑第一個坑被 PATH 環(huán)境變量誤導(dǎo)。很多開發(fā)者以為“我安裝了 Qt 的 MSVC 版本qmake 就應(yīng)該自動用 MSVC”。但 Windows 下如果同時(shí)安裝了 MinGW 版 Qt 或 MSVC 版 Qt且都加入了 PATH那么你輸入 qmake 時(shí)到底調(diào)用的是哪一個完全取決于 PATH 里誰排在前面。MinGW 版的 qmake 遇到 MSVC 的 mkspec是會直接報(bào)這個錯的。排查辦法是在命令行里執(zhí)行where qmake它會列出所有被找到的 qmake 路徑及搜索順序。確認(rèn)你實(shí)際命中的那個 qmake 和你期望的構(gòu)建套件是否一致。我用這個命令抓到了好幾次同事電腦上的 PATH 問題。第二個坑Qt Creator 里配置的 Kit 與實(shí)際編譯器不匹配。如果你在 Qt Creator 里手動添加了 MSVC 編譯器路徑但 Kit 中的 Qt 版本選成了 MinGW 版或者編譯器版本下拉框里選錯了具體小版本Qt Creator 雖然平時(shí)能通過界面幫你屏蔽許多環(huán)境問題但在某些自定義構(gòu)建步驟或外部命令調(diào)用場景下這個報(bào)錯會冒出來。建議在 Qt Creator 的工具鏈和 Qt 版本界面里逐個核對確保 Kit 的編譯器、qmake、mkspec 三者完全匹配同一套工具鏈。4.3 跨版本升級后的連帶問題升級 Visual Studio 后出現(xiàn)這個報(bào)錯本質(zhì)上是 Qt 預(yù)編譯包的 msvc-version.conf 里寫的版本號與新版 VS 不匹配。比如你原來用 VS2019 生成的項(xiàng)目升到 VS2022 后編譯器版本從 1929 變成了 1930但 Qt 的 conf 文件里還寫著 1929這不會直接觸發(fā)“isnt set”但可能引發(fā)類似版本不兼容的警告。處理方法是更新 Qt 版本或手動修改 conf 文件。反過來如果新版 VS 對你運(yùn)行的 Qt 版本來說太新預(yù)編譯包里根本沒有對應(yīng)的版本號那你只能等待 Qt 官方更新或者用上述方法二手動設(shè)置一個兼容值。這個兼容值不能隨便填要去查 Qt 官方文檔里該 Qt 版本支持的 MSVC 范圍超出范圍的版本即使能編譯過也可能踩到二進(jìn)制兼容性問題。5. 一些補(bǔ)充經(jīng)驗(yàn)和最后的建議5.1 qmake 的版本探測順序其實(shí)可以善用qmake 在 MSVC 環(huán)境下的執(zhí)行順序大致是先看 mkspec 里有沒有顯式定義 QMAKE_MSC_VER沒有就找 conf 文件再沒有就看環(huán)境變量。了解了這個順序你就知道為什么有時(shí)候改環(huán)境變量有效、有時(shí)候改文件有效、有時(shí)候兩個都要改。如果項(xiàng)目里有多個開發(fā)人員構(gòu)建環(huán)境五花八門我建議把環(huán)境變量的初始化統(tǒng)一寫進(jìn)一個“構(gòu)建環(huán)境準(zhǔn)備”腳本里就像記錄一個標(biāo)準(zhǔn)操作流程那樣。這個腳本可以是這樣echo off call C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat set QMAKE_MSC_VER1930 cd /d %~dp0 qmake your_project.pro這段腳本我在團(tuán)隊(duì)里推廣后新同事幾乎不再被 msvc-version.conf 報(bào)錯困擾。關(guān)鍵點(diǎn)在于先用 vcvars64.bat 準(zhǔn)備好環(huán)境再顯式聲明 QMAKE_MSC_VER 與你實(shí)際使用的 VS 版本一致雙重保險(xiǎn)。5.2 為什么不建議在一篇文章里只講“改環(huán)境變量”市面上很多帖子面對這個問題直接丟一句“你運(yùn)行一下 vcvars64.bat 就好了”。這句話對一部分人確實(shí)有用但對另外一部分人完全無效。無效的原因恰恰在于他們不是“忘了初始化環(huán)境”而是 mkspec 路徑被改過、conf 文件壞了、緩存過期了、PATH 指向錯誤套件。這些情況都需要針對性排查。這也是為什么本文花了大量篇幅去講 msvc-version.conf 在 qmake 構(gòu)建體系里的作用和加載路徑。你只有理解了這層機(jī)制碰到稀奇古怪的變種報(bào)錯才能快速定位。5.3 如果你用的是 CMake 而不是 qmake需要提到一個相關(guān)情況這個報(bào)錯是 qmake 特有的如果你直接用 CMake 配合 MSVC 構(gòu)建 Qt 項(xiàng)目不會看到這條信息因?yàn)?CMake 對編譯器版本的探測走的是完全不同的機(jī)制。但如果你在 CMake 項(xiàng)目里調(diào)用了 qmake 作為自定義命令有些項(xiàng)目會用 qmake 生成某些 moc 文件或資源那么這條報(bào)錯照樣會出現(xiàn)。處理思路與上面完全相同重點(diǎn)仍然是確保執(zhí)行 qmake 的那個進(jìn)程環(huán)境里已經(jīng)初始化了 MSVC 變量。5.4 排查這個問題的萬能公式最后分享一個個人總結(jié)的排查公式遇到這個報(bào)錯別慌按順序做三件事一看 qmake 路徑是否正確執(zhí)行where qmake二看 mkspec 路徑是否正確執(zhí)行qmake -query確認(rèn) QT_INSTALL_MKSPECS 和 QMAKE_MKSPECS 指向的目錄里win32-msvc 下能找到有效的 msvc-version.conf三看環(huán)境變量是否生效執(zhí)行echo %QMAKE_MSC_VER%查看是否已有值。三步排查完90% 的根因就浮出水面了。剩下的無非是緩存清理或文件修復(fù)。整套流程下來解決這個報(bào)錯的時(shí)間應(yīng)該控制在十分鐘以內(nèi)而不是像當(dāng)年的我一樣靠搜索引擎漫無目的地試。這個報(bào)錯的本質(zhì)并不復(fù)雜它只是 qmake 在 Windows 多編譯器環(huán)境下的一次“環(huán)境感知失敗”。搞清楚了它的加載路徑、變量來源和觸發(fā)條件以后無論你換什么 Qt 版本、VS 版本、CI 平臺都能一眼看出問題出在哪個環(huán)節(jié)。希望這篇分享能幫你省下我當(dāng)年踩過的那些坑。