Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
如今我們正在開發一個新的插件,一個能夠讓開發者在 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 或我的帳號聯繫到我們。