Linux 工程師新法寶:在 Visual Studio 上用 C++ 寫 Linux - OS...

2021-01-11 開源中國

如今我們正在開發一個新的插件,一個能夠讓開發者在 Visual Studio (以下簡稱 VS ) 上建構能夠在 Linux 上運行 C++ 程序的套件。開發者可以藉由這個插件將 C++ 程序移轉到 Linux 伺服器、PC 以及行動裝置上,也同時可以藉由這個插件將這些機器連結至你的 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 或我的帳號聯繫到我們。

英文原文:Visual C++ for Linux Development  

相關焦點

  • 嵌入式Linux開發環境的搭建之:嵌入式開發環境的搭建
    因此,現在嵌入式平臺提供廠商一般會提供在該平臺上測試通過的交叉編譯器,而且很多公司把以上安裝步驟全部寫入腳本文件或者以發行包的形式提供,這樣就大大方便了用戶的使用。如優龍的FS2410開發光碟裡就附帶了2.95.3和3.3.2兩個版本的交叉編譯器,其中前一個版本是用於編譯Linux2.4內核的,而後一個版本是用於編譯Linux2.6版本內核的。
  • 「linux專欄」嘔心瀝血兩天,就為linux中安裝拼音輸入法
    幾經百度,自我實踐,最後發現最有效的辦法就是使用yum源安裝ibus的拼音輸入法,當然ibus也是眾多linux用戶反響比較穩定的一款輸入法。當然我們也有必要為大家說明一下,就目前來看,linux中常用的中文輸入法平臺有IBus、fcitx和scim。scim現在維護滯後,不推薦使用。
  • 嵌入式linux新手入門手記-準備qt5.4.1開發平臺
    這個手記寫到這裡,am335x的軟體平臺已經能夠正常工作了, tslib也已經能夠進行正確的觸控螢幕校正,自己編寫一個hello world的程序,並交叉編譯後,能夠在am335x上運行,並在超級終端上列印出「hello world」。
  • Linux如何安裝軟體
    ivh glibc-devel-2.5-24.i386.rpmrpm -ivh libgomp-4.1.2-42.el5.i386.rpmrpm -ivh gcc-4.1.2-42.el5.i386.rpmg++rpm -ivh libstdc++-devel-4.1.2-48.el5.i386.rpmrpm -ivh gcc-c++
  • linux下安裝虛擬機,完美在linux系統下運行通達信軟體
    現在越來越多的人使用linux系統,現在很多的國產作業系統都是基於linux內核上的。雖說不少的軟體都可以運行在linux的系統上。但是對於股票軟體來說在linux上的使用是一個硬傷。能夠運行在linux下的國內股票軟體少之又少。
  • Linux系統的Linux應該怎麼讀?正確讀法在這裡,很多人都讀錯了!
    3、有人綜合網上和linux自己的讀音,概括出幾個自認為最合適也最通用的讀法:/li'n^ks/(「裡那克斯」)或/'li:nэks/(「裡訥克斯」)或/li'nju:ks/(「裡紐克斯」)。4、這幾個應該是誰都聽得懂的。至於哪個比較正宗,當然是linux的原因。但事實上使用linux哪種讀法的人似乎都不在少數。
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU 工程各種工具和資料庫的作業系統。在這幾個簡要的段落中。有不少新的名詞被引入了進來。下面我對幾個重要的概念進行描述。
  • 嵌入式Linux的GDB調試環境建立
    這樣,應用程式在嵌入式目標系統上運行,而gdb調試在Host端,所以要採用遠程調試(remote)的方法。本文引用地址:http://www.eepw.com.cn/article/76982.htm    一、建立安裝gdb組件    從ftp://ftp.gnu.org/gnu/gdb上下載gdb套件,我下載的是gdb-5.2.1.tar.gz。
  • Linux基礎命令之:實驗內容及小結
    注意由於ntfs格式在Linux的早期版本中是不安全的,只能讀,不能寫,因此最好把文件放到fat32格式的文件系統中。(7)進入掛載目錄,查看是否確實掛載上。命令為:cd/mnt/win;ls(8)在/usr/local下建一個名為arm的目錄。
  • Linux2.6內核驅動移植參考
    作者:晏渭川 隨著Linux2.6的發布,由於2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個 函數的用法。
  • 嵌入式Linux設備驅動開發之:實驗內容——test驅動
    這個簡單的驅動程序的原始碼如下所示:/*test_drv.c*/#includelinux/module.h>#includelinux/init.h>#includelinux/fs.h>#includelinux/kernel.h>#includelinux/slab.h
  • Linux下如何掛載新磁碟:mount
    前言在linux系統伺服器上插了一個U盤,結果系統顯示不出來,是什麼原因導致了系統不能識別U盤呢?經過一番搜索,發現新的硬體設備插在linux系統上時,如果不能正常顯示,則需要通過掛載讓U盤顯示出來,這裡就用到了我們今天要介紹的命令:mount。
  • linux下SCP指令的使用
    SCP傳輸是基於SSH的加密傳輸,也就是說知道ssh的帳密就可以上下載文件了,因此比較安全。SCP常用實例(在linux的centos環境下為例,從192.168.200.10現在一個文件到本地)1、從遠程伺服器下載文件到本地伺服器。
  • 升級Ubuntu Linux 內核的幾種不同方法
    這 7 種方法裡,有 5 種需要重啟系統來使新內核生效,其他兩種則不用。-- Sk這個指南裡介紹了 7 種為 Ubuntu 升級 Linux 內核的不同方法。這 7 種方法裡,有 5 種需要重啟系統來使新內核生效,其他兩種則不用。升級之前,強烈建議你將重要數據進行備份! 這裡提到的所有方法只在 Ubuntu 中測試過。
  • 網絡工程師和Linux運維工程師有什麼區別?學哪個比較好?
    尤其是數據中心的部署肯定部署在雲上的,導師讓我有精力的情況下一定要多去了解。在工作中,有一天突然遇到了Linux系統,公司mrtg監控的老系統是公司一位老總以前用Linux系統搭的,雖然以前聽說過Linux,但從來沒接觸過,在通過文檔完成工作後,我開始了解Linux系統,當時想著雲計算的基礎也是Linux,學習一下怎麼都不虧。
  • ARM Linux根文件系統Root Filesystem的製作
    290.entry本文引用地址:http://www.eepw.com.cn/article/201611/317986.htm關於根文件系統的製作,網絡上有很多文章,大多數都只講到建幾個目錄,然後用Busybox做個Shell,有很多關鍵的東西沒有說。經過很長時間的摸爬滾打,我終於能夠白手起家建立一個根文件系統了。
  • 「正點原子Linux連載」第四十二章新字符設備驅動實驗
    register_chrdev和unregister_chrdev這兩個函數是老版本驅動使用的函數,現在新的字符設備驅動已經不再使用這兩個函數,而是使用Linux內核推薦的新字符設備驅動API函數。本節我們就來學習一下如何編寫新字符設備驅動,並且在驅動模塊加載的時候自動創建設備節點文件。
  • Linux下C編程基礎之:本章小結與思考與練習
    最後介紹的是autotools的使用,這是非常有用的工具,希望讀者能夠掌握。本章的實驗安排比較多,包括了vi、gdb、makefile和autotool的使用,由於這些都是Linux中的常用軟體,因此希望讀者切實掌握。3.9 思考與練習在Linux下綜合使用vi、gcc編譯器和gdb調試器開發漢諾塔遊戲程序。