很久以前,Heresy 有寫過《OpenCC 簡易使用紀錄》這篇文章,簡單記錄當時使用 OpenCC 的情況了。而最近,由於又要改動相關的程式,所以就又需要重新建置它了。
但是沒想到,按照之前建置的方法,在 Visual Studio 2017 下,卻出現了一些問題…
問題主要有兩個:
- PhraseExtract.cpp 這個檔案會出現 C2059、C2001 等語法錯誤
- 編譯 Config.hcpp 的時候,VC 提供的 setjmp.h、csetjmp 兩個檔案出現 C3829 等錯誤
網路上找了一下,在《使用Visual Studio 2017(VS2017)编译OpenCC 1.0.4 (Open Chinese Convert)源代码》這篇文章,可以看到有碰到完全一樣的問題。
而針對第一個問題,也就是 PhraseExtract.cpp 這個檔案無法正確編譯的問題,錯誤狀況如下:
而這個問題其實算是滿簡單的,就是檔案的編碼不對。
要解決這個問題,只要用 Visual Studio 開啟這個檔案,再點選「檔案」的「另存 PhraseExtract.cpp 為…」,然後點「存檔」旁邊的三角形,再選「以編碼方式儲存…」(下圖),就可以開啟「進階儲存選項」了。
在「進階儲存選項」裡面,則是要去修改「編碼方式」,這邊要選的是「Unicode(位元組由大到小) – 字碼頁 1201」;這邊主要是認「字碼頁」的編號,而 1201 這一項應該會在滿上面的。
這樣重新儲存(把本來的檔案蓋掉)後,應該就可以正確編譯了。
第二個問題,則是在編譯 Config.hcpp 的時候,VC 的 setjmp.h、csetjmp 兩個檔案出現 C3829、C2206 等錯誤。
這個問題,在《使用Visual Studio 2017(VS2017)编译OpenCC 1.0.4 (Open Chinese Convert)源代码》一文中,算是給了一個滿鴕鳥的方法,那就是用 VS2015 的環境來建置。
而後來又看了一下,這東西已經有找到明確的原因,也有明確的解法了。他的紀錄是「Use noexcept implemented in Visual C++ 2015 and greater」這個 issue。
出問題的原因,是因為 VC 以前沒有「noexcept」這個關鍵字,所以他在「Exception.hpp」自己定義了一個。但是後來 VC 有支援了,所以這邊自行定義的「noexcept」就造成問題了。
所以,解決方法,就是去更嚴謹地偵測 VC 的版本,藉此判斷到底要不要自己去定義「noexcept」了。
他這邊的修改方式,是把
#ifdef _MSC_VER // Until Visual Studio 2013 (12.0), C++ 11 "noexcept" qualifier is not supported #define noexcept #endif // ifdef _MSC_VER
改成
#if defined(_MSC_VER) && _MSC_VER < 1900
// Before Visual Studio 2015 (14.0), C++ 11 "noexcept" qualifier is not supported #define noexcept #endif // ifdef _MSC_VER
理論上這樣就沒問題了。