上禮拜微軟推出了 Visual Studio 2022 的更新版本 17.10,提供了更完整的 GitHub Copilot 整合。而雖然官方公告裡面和 C++ 有關的東西並不多,但是在 Heresy 這邊卻造成了一些既有專案的問題… orz
其中,在更新到 17.10 後,看來是會和 NVIDIA CUDA SDK 有嚴重的相容性問題,而且現在好像還沒辦法繞過去,所以如果是專案有用到 CUDA 的話,建議先不要更新到 17.10。
這邊就稍微紀錄一下這邊碰到的問題吧。
和 NVIDIA CUDA SDK 的相容性問題
這個問題滿大的,而且好像暫時還沒辦法繞過去?
Heresy 這邊本來是用比較舊的 CUDA 12.0,但是在更新後會碰到下面的錯誤:
fatal error C1189: #error: -- unsupported Microsoft Visual Studio version!
Only the versions between 2017 and 2022 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.
這邊的問題基本上是因為 NVIDIA 內部的 MSVC 版本檢查有點蠢、所以導致他無法正確將 17.10 視為 Visual Studio 2022 的關係。
而 Heresy 就想趁這個時候把環境的 CUDA 更新到最新的 12.5 吧?結果這邊就碰到另一個錯誤了:
nvcc error : 'cudafe++' died with status 0xC0000409
基本上…算是 CUDA 的編譯器直接掛掉、而且沒有比較詳細的錯誤的狀況了? o_O
這個問題有人也更新到官方論壇的《CUDACOMPILE : nvcc error : ‘cudafe++’ died with status 0xC0000409》這個討論串了,裡面官方也有回復目前團隊正在處理這個問題,暫時的解法就是把 Visual Studio 退版回 17.9 了。
錯誤 MSB6006
這邊碰到的另一個問題,是好幾個專案都碰到建置的時候會出現「MSB6006」這個錯誤;而詳細的內容,則是:
"CL.exe" 以返回碼 -1073741819 結束。
基本上,應該就是 MSVC 的編譯器 cl 跑到一半就掛了…
考慮到死掉的方法,這邊應該不是語法的問題,而是踩到編譯器的地雷了。
這邊研究過後,發現是古老的 tecio2009(會用這個版本主要是授權問題)的 header 和 手邊在用的 libjpeg-turbo 3.0 的 header 有衝突造成的;下面是個簡單的錯誤狀況:
#include <stdio.h> #include <tecio/MASTER.h> #include <tecio/GLOBAL.h> #include <jpeg/jpeglib.h> int main() { return 0; }
而解決方法呢,基本上就是調整 include 順序、先去 include libjpeg、或是直接拆分檔案讓兩個不要同時出現就可以了。
這類的問題也不只限於這兩個函式庫,這邊發現 freeglut 和 OpenNI2 也會造成同樣的問題。
另外,後來也發現這個問題似乎只會出現在繁體中文的環境?如果把 Visual Studio 切換成英文語系的話,問題就消失了?而在中文版的命令提示字元裡面,如果先透過 chcp 437
切換成英文的話,也不會出現問題…
所以這個問題雖然麻煩了一點,但是還是可以繞過去了。而這邊姑且也像微軟反映(link)了,微軟會不會處理就不知道了。
目前大概就是這樣了?寫這篇主要就是提醒,如果要更新 Visual Studio 2022 17.10 的話,可能要注意一下會不會踩到地雷了。
另外,話說以個人的印象,NVIDIA CUDA 在 Visual Studio 的整合上,個人一直覺得不算很好;如果只是要用單一版本到還好,但是如果要更換 CUDA SDK 的版本的時候,官方似乎就沒有提供一個良好的方法來升級了。到頭來 Heresy 這邊都還是透過用文字編輯器去修改 vcxproj
來做。
而以往在 Visual Studio 推出大版本更新的時候,大多也都會有相容性的問題、可能得等好一陣子才會相容(過去的例子);所以變成有在使用 CUDA 專案的時候,往往變成沒辦法在第一階段更新…
不過,像這種只是次版號的更新就搞到不相容…恩,以前好像沒有碰過? XD
中文版 MSB6006 的問題在今天釋出的 17.10.1 似乎是解決了。