在 Visual Studio 2017 建置 OpenCC


很久以前,Heresy 有寫過《OpenCC 簡易使用紀錄》這篇文章,簡單記錄當時使用 OpenCC 的情況了。而最近,由於又要改動相關的程式,所以就又需要重新建置它了。

但是沒想到,按照之前建置的方法,在 Visual Studio 2017 下,卻出現了一些問題…

問題主要有兩個:

  1. PhraseExtract.cpp 這個檔案會出現 C2059、C2001 等語法錯誤
  2. 編譯 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

理論上這樣就沒問題了。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.