在 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 使用 Just My Code,避免 C++ 偵錯時顯示大量外部函式庫的內容

在使用 Visual C++ 開發程式的時候,其實有許多好用的偵錯工具,都可以幫助開發者找到程式的問題到底在哪;包括了各種中斷點、呼叫堆疊(call stack)、以及逐步執行(step)等等,能善用的話,都是很方便的工具。

但是,當外部函式庫使用多了之後,其實在使用呼叫堆疊和逐步執行的時候,往往會碰到一個問題,那就是外部函式庫會造成嚴重的干擾,讓偵錯變得相當麻煩…

比如說下面就是 Heresy 自己用 Boost Beast 來試著寫 WebSocket Server 時,中斷時的呼叫堆疊:

閱讀更多»

允許 32 位元應用程式使用 2GB 以上的記憶體

目前大部分的電腦系統,應該都已經從 32 位元轉換到 64 位元了,所以在開發應用程式的時候,其實在一定的程度上,可以「揮霍」記憶體。(笑

但是,有的時候受限於第三方函式庫,可能還是需要建置 32 位元的程式;實際上,Heresy 這邊最近就有碰到,因為廠商硬體的驅動程式的原因,無法把程式建置成 64 位元的版本。

而只能建置成 32 位元的最大問題,就是記憶體使用量大幅變小了…

基本上,在 Windows 環境下,32 位元的應用程式能使用的記憶體,最大就是 1.6GB 左右了;如果程式向系統要求要求超過 1.6GB 的記憶體,就會出錯了。

閱讀更多»

C++ 的一些 attribute

C++ 的 attribute(參考)是在 C++11 新加入的東西。他基本上算是在程式碼裡面,加上特別的輔助說明,給編譯器看,讓編譯器可以在編譯時針對這些屬性來做處理。

這樣的功能其實以前編譯器大多是有自己定義。像 gcc 是用 __attribute__參考)、MSVC 則是有 __declspec參考,現在則算是終於有個統一的標準了。

目前 C++ attribute 的寫法滿特別的,他是直接用兩組中括號夾住、寫成 [[…]] 這樣的形式。而到 C++20 為止,也訂了超過十個 attribute 了(到還沒定案的 C++20)(除了標準定義的部分,編譯器也還有可以有自己定義的東西);在大部分的狀況下,他們主要的功能大概就是避免編譯器產生不必要的警告、增加程式碼的可讀性,以及讓編譯器更好最佳化吧~

其中有的個人覺得還算滿有用的,所以這邊就大概紀錄一下。

閱讀更多»

在 Visual Studio 2017 使用 CUDA 9.2

雖然 Heresy 個人算是滿早期開始接觸 NVIDIA CUDA 的,但是其實已經沒有在碰 NVIDIA CUDA 程式好一段時間了…不過,由於在開發的專案裡面,還是有一些地方有用到別人寫的 CUDA 程式,所以在維護的時候,還是需要去考慮他。

而根據從以前到現在的經驗,NVIDIA 針對 Visual Studio 的支援,一向不是做得很快、很好;往往 Visual Studio 已經出了新版本了,CUDA 才終於支援上一個版本…

某方面來說,這應該也是由於 NVIDIA CUDA 的重點是高速計算、大部分這個領域的用戶,其實都是把程式放在 Linux 叢集上跑的關係吧?但是,這對於一般 Windows 的開發者來說,其實還滿麻煩的…

最近,Heresy 在把手邊的專案移植到 Visual Studio 2017 上,CUDA 又出現問題了… orz

閱讀更多»

邀請別人幫忙共同 debug:Visual Studio Live Share

「Visual Studio Live Share」這個東西,是微軟在去年十一月發表的一項給 Visual Studio 2017Visual Studio Code 用的外掛套件。

他主要的用處,就是當碰到自己不知道該怎麼解的程式問題的時候,可以邀請別人一起進來找問題!

他的形式就是有點像是 Google 文件的共筆模式,可以多人一起編輯、同時也看的到對方的滑鼠游標在哪裡、做了那些修改;而雖然要偵錯的程式還是在本地端執行,但是遠端近來協助的人,還是可以透過監看變數、設定中斷點等方法,來幫忙找問題~

當時在發表時(網頁),就讓人覺得是個相當有趣的功能~而對於團隊合作的程式開發來說,某方面來說應該也是有一定的實用性的。

不過,去年底發表時,這東西還只是內部測試,一般人沒辦法玩,所以當時也就看看就算了。但是,今年的 MS Build 2018,微軟則是把這東西當作開放預覽版,放出來讓所有使用者測試了!所以,有興趣的話,就可以玩看看了~

閱讀更多»

一些比較少人知道的 VisualStudio 偵錯功能

這篇主要是針對微軟 VisualStudio Team 部落格的《7 lesser known hacks for debugging in Visual Studio》和《7 More Lesser-known Debugging Tactics for Visual Studio》這兩篇文章,做簡單的整理。

在 Heresy 來看,微軟的 Visual Studio 算是目前數一數二的程式開發環境。不過另一方面,它的功能也相當地多,多到一般人應該有超過七成的功能都沒有用過。而在這些從來沒用過、甚至從來不知道的功能裡面,其實有些是相當實用、相當方便的!

微軟在這邊就是列出了 7 + 7 個罕為人知的 debug 技巧,來分享給開發者;不過裡面有的內容是針對 C# 這類 managed code 的,有的則是針對原生 C++ 的,並非全部都可以使用。

而這邊 Heresy 則是稍微再重新整理一些 C++ 可以用、個人也覺得比較有用的出來了~

另外,這邊所列的功能,大多是在 Visual Studio 2015 就已經有的,不過還是有部分功能是 Visual Studio 2017 才有的;如果是 2017 才有的,這邊也會特別強調。

閱讀更多»

微軟正式推出 Visual Studio 2017

微軟又針對旗下的程式開發環境、Visual Studio 推出新版本囉~這次的版本是 Visual Studio 2017,目前也已經可以下載安裝了~它的官方網站是:

https://www.visualstudio.com/zh-hant/

而新功能的介紹,則可以參考「新功能」的頁面(連結)、或是直接看 release note 的細節(連結)。

目前的 Visual Studio 有三個版本,包括了免費的社群版(Community、官網)、一般人用的專業版(Professional、官網),以及最高階的企業版(Enterprise、官網)。

閱讀更多»

在 Windows 寫 Linux 程式:Visual Studio + Windows Subsystem for Linux

微軟的 VIsual Studio 在 Heresy 來看,算是 Windows 上最好的 C++ 開發環境,但是缺點就是沒有 Linux 版了。不過,微軟在這幾年正積極地往跨平台、開放原始碼的方向走,所以這部分的狀況倒也有些改變了~

在 2015 年,微軟也已經發表了跨平台的開發環境、Visual Studio Code,雖然還是沒有開放原始碼,但是也算是聊勝於無了。而同時,Visual Studio 2015 也加入了跨平台的程式開發功能!除了 Windows 外,也支援了 Android、iOS 以及 Linux~(不過當時 Heresy 想測試 Linux 的偵錯一直沒有成功就是了…)

這篇,則是 Heresy 看到微軟的 Visual C++ Team Blog 的《Targeting the Windows Subsystem for Linux from Visual Studio》後,才想起可以嘗試讓 Visual Studio 搭配 Windows 10 的 Bash on Ubuntu on Windows(Windows Subsystem for Linux、以下簡稱 WSL)來在單台 Windows PC 上、進行 Linux 上的 C++ 程式開發、偵錯

這篇的基本需求,主要是:

閱讀更多»

Visual C++ 2015 Update 2 編譯出來的程式包含了遙測的功能?

Heresy 是看到《VS2015: How to Remove Windows Telemetry Function Call from your C/C++ Binaries》這篇文章才知道這件事了…

基本上,就是 sammiesdog 在 Reddit 上說(連結),他發現他用 Visual Studio 2015 Update 2 來編譯一個最簡單的 C++ 的程式的時候,編譯器所產生的二進為檔(binary),裡面赫然發現他會去呼叫「telemetry_main_invoke_trigger」和「telemetry_main_return_trigger」!

就算你的 C++ 程式碼只寫了:

int main() {
return 0; }

編譯出來的執行檔裡面,還是可以發現「telemetry」的蹤跡…

閱讀更多»