Linux 工程師新法寶 - 在 Visual Studio 上用 C++ 寫 Linux 程式
如今我們正在開發一個新的插件,一個能夠讓開發者在 Visual Studio (以下簡稱 VS ) 上建構能夠在 Linux 上運行 C++ 程式碼的套件。開發者可以藉由這個插件將 C++ 程式碼移轉到 Linux 伺服器、桌機以及行動裝置上,也同時可以藉由這個插件將這些機器連結至你的 VS 上。VS 將會自動地複製一份並在遠端建構你的來源檔,再運行帶有除錯器的應用程式。我們的這項計畫也針對特殊的架構提供系統支援,包含 ARM 等。下方文章將繼續介紹使用我們這套全新的 Linux 計畫。
目前我們僅支援在遠端的目標 Linux 機器提供建構服務。我們並沒有限制特定的 Linux 發佈版本,但我們仍舊在一些工具的表現上有些相依性的差異。需要特別注意的是,我們需要 openssh-server、g++、gdb 以及 gdbserver。用你最習慣的套件管理工具來安裝他們,例如在 Debian 類型的 Linux 就可以使用:
sudo apt-get install openssh-server g++ gdb gdbserver
安裝
下載 Visual C++ for Linux Development extension 或從 Visual Studio 上的插件管理員來獲得。目前我們在 Visual Studio 上的 Android Tools 上已有相依支援。如果你已經安裝了 VS 的話,你可以藉由 Add Remove Programs 來新增這些功能,編輯 VS 然後在 Visual C++ 行動裝置開發下選擇他們。
要開始一個新的專案可以透過以下路徑:Templates > Visual C++ > Cross Platform > Linux。
目前我們有三個可以使用的模板:針對像 Raspberry Pi 等物聯網裝置設計的 Blink、最基本的應用程式樣板 Console Application 以及讓開發者自己選擇需要加入的來源檔以及從預設設定起的 Empty。
你的第一個 VS Linux 專案
我們從建構一個主控台 app 開始。從模板新增完你的專案後,在 printf 敘述句的地方設下一個中斷點,然後敲擊 F5 或遠端 GDB 除錯器按鈕。根據預設值,這個主控台 app 設定與 debug/x64 的環境相容。如果你的遠端連線標的是 x86 或 arm 架構,那你需要先改變上述設定。在我演示的這個範例我使用的是 x64 Ubuntu VM。
由於這是第一次連結到標的的 Linux 機器,所以會彈出一個連接資訊視窗,是由在建構專案時所觸發的。
我們同時支援密碼以及認證形式的驗證方式,包含使用複雜密碼的認證。在第一次成功連接後,我們會將你的連結資訊儲存以便在日後需要連接時快速存取。你可以從 Tools > Options > Cross Platform > Linux 的路徑來管理你已儲存的連結資訊,以及是的,密碼/複雜密碼是已加密形式儲存的。我們也同時計劃在未來的更新版本中,在連接時無需儲存連結資訊。
在連接的過程中,你的來源檔會被複製到遠端的 Linux 機器上,並觸發 gcc 並根據專案的屬性設定來建構原始碼。在專案建構完畢之後,你的程式碼將會在遠端的機器上執行,並停止在我們先前所設下的中斷點上。
Linux 專案屬性
我們可以藉由以下的專案屬性來理解,東西是怎麼被部署到遠端 Linux 機器上的。
在 remote settings 下,你可以看到 remote 根目錄是預設在 ~/projects/ ,且該路徑下的遠端專案目錄會與我們的專案名稱相符。從 Linux 機器上去看的話,我們可以在 ~/projects/ConsoleApplication1 下發現建構後的成品 main.cpp。
根據專案的 General setting,可以了解到我們針對 Output 以及 Intermediate 路徑是怎麼設定的。除此之外,你可以發現到這個專案是被設定成一個應用程式的 — 代表我們的專案執行檔 ConsoleApplication1.out 是在 bin/x64/Debug/ 路徑下。另外可以注意到的是,我們也同時支援靜態以及動態的設定格式。
Linux 物聯網專案
現在我們來研究物聯網裝置的部分 — 以 Raspberry Pi 為例。你可以使用任何類型的 Pi 來執行 Raspbian。在我們的 Blink 範例裡我們使用 wiringPi — 如果你沒有這個安裝選項你也可以選擇從 apt 或來源檔來安裝。在 Tools > Options 搜尋 Linux 來新增一個連結,然後點擊 “add” 來新增一個連結到你的 Raspberry Pi。
從專案屬性設定的地方查看 Build Events 下的 Remote Post-Build Events。
你可以藉由這個設定在遠端已建構好專案的 Linux 標的上執行指令。這個模板已先預設了針對 LED 輸出的 GPIO pin,所以我們不需要再以 root 的身份執行我們的執行檔。
現在將一個 LED 連接到 Raspberry Pi 上的 pin 17 位置(如下圖)。
打開 main.cpp 檔,並在第一個 digitalWrite 後 delay call 的地方設下中斷點,然後敲擊 F5。你可以看到你的 LED 燈亮起,且執行程序會在你下中斷點的地方停住。將你的程式碼持續執行到下一個 digitalWrite call 之後便可以看到 LED 燈熄滅。
可以透過瀏覽我們的物聯網研發專頁,來追蹤所有我們目前針對這樣的系統所釋出的功能。
桌面應用程式
我們剛已在上述的文章中,介紹了無介面 (headless) 以及裝置型的 Linux 應用程式,那桌面型的呢?在這裡我們將介紹一點特別的:我們將在 Linux 桌面上執行一個 OpenGL 應用程式。首先要確定的是,你的 Linux 桌面已經設定為包含 OpenGL 的環境,下述是我們會需要用到的 apt 套件:libgles1-mesa、libgles1-mesa-dev、freeglut3 以及 freeglut3-dev。
接下來請先創建一個空的 Linux 專案,然後前往 Julien Guertault’s OpenGL 教學下載旋轉方塊的來源檔,將其解壓縮並將 main.c 加到你的專案下。要能夠運行 Intellisense,你需要將 OpenGL 的標頭 (headers) 新增到 VC++ Directories,你可以從 OpenGL Registry 裡下載他們。現在前往你的專案屬性設定,然後新增 export DISPLAY=:0.0 到 Pre-Launch command 下。
然後,在 Linker Input 下新增 “m;GL;GLU;glut” 到 Library Dependencies 欄位。
另外,確認你的遠端設定是對應到對的機器。
接下來按下 F5。
還有一些有趣值得下中斷點的地方,例如大約在 80 行左右的位置有可以調整方塊旋轉的設定(試著調整看看 alpha 值),或在 KeyboardFunc 裡可以檢查按下鍵盤時所輸入的值。
開始實做原生的 Linux 應用
我們期望您與我們對於這些新開放的可能擁有一樣的期待。
安裝 Visual C++ for Linux Development extension,嘗試看看並告知我們哪些是你可以成功運行,以及哪些是你遇到的阻礙或遭遇任何問題。如果你有興趣的領域是在物聯網的部分的話,可以前往關注我們的 IoT Development page 以獲取最新資訊。你可以藉由這個部落格,或展覽頁的額外分頁、VS 回饋頻道以及 Twitter 上的 @visualc、@robotdad 或我的帳號聯繫到我們。