使用vs2019進行Linux遠程開發的方法步驟_Linux

來源:腳本之家  責任編輯:小易  

Linux的紅帽RHCE認證相對來說還是比較容易拿到的,一般只要找對對的方法,還是很容易拿到的,紅帽RHCA認證才是真的很難拿到的。目前,紅帽認證還是考紅帽7版本的內容,所以比較好拿,等改成紅帽8版本內容后,一段時間內會比較難拿。樓主如果對Linux系統感興趣,想學習更多Linux系統知識,可以百度《Linux就該這么學》,不錯的一本Linux入門教程www.13333515.buzz防采集請勿采集本網。

通常,當我們開發Linux程序時有兩種方案:

    在Linux上直接編寫程序并進行運行測試和調試 在Windows或Mac OS X上借助工具進行遠程開發

WinPE是可以通過U盤來安裝Linux系統的,下面以U盤WinPE安裝Centos5.3版Linux為例,方法如下: 1、在U盤上安裝好WinPE并在U盤根目錄建立一個名為LMT的目錄。2、將CentOS-6.4-x86_64-minimal.iso

雖然我自己是在Linux環境上直接進行開發的,但也有許多的人是在Windows環境上從事開發工作的,如果離開自己熟悉的系統到陌生的環境上也許會影響到工作效率。

linux的文件被rm刪除是可以通過linux自帶的文件恢復工具debugfs來進行恢復,但是只能恢復ext2文件系統的文件,不能恢復ext3文件系統的文件。1,首先查看需要恢復的文件所在的文件系統 命令行模式

因此今天我們就來看下如何在Windows上使用Visual Studio 2019進行Linux遠程開發以及如何避免常見的陷阱。

Visual Studio的跨平臺開發功能簡介

正因為它的穩定才獲得了眾多用戶的青睞,因為它的高效,它的使用范圍更加廣闊,然而Linux還可以提供一些高可靠性的服務,比如:LNMP、虛擬化、數據庫服務等等。由于Linux要保證其穩定性,所以并沒有像其它

從visual studio 2017開始微軟推出了vs的跨平臺開發功能,你可以在vs中編輯代碼,隨后進行跨平臺編譯和遠程調試,將原先我們需要手動完成的工作進行了自動化,大幅減輕了我們的負擔。其中支持的平臺包括Android和Linux,也就是我們今天要重點介紹的主角。

Linux運維可以從事的崗位有很多,發展前景也是不錯的,只要你學習好、技術強、有足夠的實戰項目經驗,還是非常好找工作的。您是打算學習Linux運維嗎?您可以先看看我校的叢書系列《跟老男孩學

也許你會好奇,vs究竟是怎樣進行遠程開發的,雖然你不用了解這些知識也可以進行開發,但我還是希望能用兩分鐘做個簡短的解釋。

vs進行遠程開發分為兩步:

    創建遠程環境的連接,隨后讓vs將遠程環境中的系統頭文件同步到本地(也可以指定其他地方的頭文件,后面會講解),c++的代碼補全只需要頭文件即可。 當代碼寫好后,選擇合適的遠程環境,vs將目標文件和代碼復制到遠程環境的指定位置,接著根據你的配置進行編譯。 隨后vs將會在console的gdb或gdbserver中運行你的程序,在此期間你可以充分享受vs debugger帶來的高效和便利。

經過上述步驟之后你就可以在vs里調試自己編寫的跨平臺程序了。

使用vs2019進行Linux遠程開發

簡介到此結束了,下面我們來看看在vs2019進行Linux開發的圖文教程。在我們開始之前,首先要做點準備工作:

    安裝好vs2019,且勾選了c++ for Linux功能; 準備一個可用的Linux遠程環境,例如配置了靜態IP的Linux虛擬機,并且已經安裝好了GCC工具鏈以及openssh。

做好準備后我們就該進入正題了。

創建項目

安裝好c++ for Linux功能后我們會在創建新項目的面板中看到Linux的選項,如圖:

這里我們選擇了使用傳統的vs項目解決方案構建的空白控制臺程序,后續的文章中你還可以看到如何創建cmake項目,這里暫且不提。

下面沒什么要說的,選擇項目的存儲位置,注意是本地的位置,遠程機器的位置在后面會進行配置:

點擊創建,我們的遠程開發項目就創建成功了。

配置遠程項目

vs不能編輯空項目的配置,所以我們先在項目中創建一個main.cpp,然后點擊頂部菜單:項目->屬性,你就能看到項目的配置界面了:

遠程計算機是在調試中的遠程連接管理器中添加的。這里一般不需要改動,除非你需要改變項目的類型或編譯結果的存放位置。如果有多個遠程環境時,也可以在這里進行選擇。

調試部分提供了gdbgdbserver,前者是讓vs在Linux上啟動一個console,然后在其中運行gdb并返回輸出,如果你的Linux上的終端配置了彩色輸出,那么和遺憾vs并不認識他們,會顯示成原始的字符串;使用gdbserver時會在遠程啟用gdbserver,本地vs解析回傳的數據不會出現雜音。這里我們選擇了gdbserver,如果你發現無法打斷點,那么參考微軟的建議,換回gdb方案:

接著是配置的重點,首先是配置需要同步的遠程環境的頭文件,有了這些文件vs才能對你的代碼進行自動補全和提示:

默認復制的路徑通常已經包含了Linux上大部分的頭文件,通常我們也不需要做更改。頭文件的同步發生在第一次構建項目成功后或添加遠程連接后手動同步。

接著是c/c++編譯器的選擇,也就是對gcc和g++編譯參數的配置,講解這些參數超出了我們的討論范圍,我們這里只需要選擇合適的c++標準版本:

這里我們選擇了c++17。其他設置與在Windows上進行開發時一樣,vs可以自動轉換成g++的參數,這里就不再贅述。

添加遠程環境

有了遠程環境我們才能同步頭文件或者進行調試運行。

在第一次編譯或調試你的項目時vs會自動讓你連接遠程環境,當然,我們推薦在調試->選項->跨平臺->連接管理器中進行設置:

填入你的遠程ip/域名,端口ssh默認為22,安全起見你需要修改成其他端口,這里方便演示使用了默認配置,密碼同上,你應該考慮使用更安全的ssh私鑰登錄。

登錄成功后這個連接就添加完成了,我們看到管理器下面還有一個遠程標頭管理器的設置項,這就是用來同步頭文件的:

點擊更新按鈕就會開始同步頭文件,這些文件會被緩存在本地,因為要從遠程一次性復制大量文件,所以可能會花費較長的時間。

這樣遠程環境就添加好了,可以開始寫代碼了。

本地編寫和遠程調試

至此你已經可以在vs中編寫面向Linux平臺的代碼了,自動補全可以正常工作:

可以看到Linux中的頭文件和結構體都已經可以識別了。如果你發現無法自動補全(通常發生在剛添加遠程連接或是項目設置發生了變化后),先試試關閉vs重新打開,如果沒用請嘗試刷新intellisense或重新同步頭文件。

在編輯結束后我們就能點擊調試按鈕運行我們的程序了:

注意,構建的體系架構必須是和遠程環境一致的,比如遠程環境是x64,這里可以選擇x64或x86,但是不能選擇arm,否則會報錯。

這是測試代碼,它將輸出當前Linux系統內核的版本:

#include <sys/utsname.h>#include <iostream>#include <cstdio>int main(){ auto start = chrono::high_resolution_clock::now(); utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl;}

點擊調試->Linux 控制臺,會顯示一個可以交互的console,你可以在其中輸入內容或是看到程序的輸出:

程序運行成功。

避免踩坑

遠程編譯順利完成后,我們就可以接著利用vs debugger設置斷點,在斷點處查看變量,甚至對運行中的Linux進行動態性能分析了。

不過在此之前,還有一些坑需要提前踩掉。

中文亂碼

編碼問題帶來的麻煩永遠會被放在第一位,畢竟當人們看到預想的輸出實際上是一堆亂碼時總會不可避免得緊張起來。

眾所周知,編碼問題一直是老大難,特別是Windows上中文環境通常是GB18030或GBK,而Linux上統一為utf8時。

下面看個實際例子,通常我們的程序里只包含ASCII字符的話不容易產生問題,所以我們加上一點中文字符:

#include <sys/utsname.h>#include <iostream>#include <cstdio>#include <string>int main(){ utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; std::cout << "輸入內容:"; std::string input; std::cin >> input; std::cout << "你輸入了:" << input << std::endl;}

對于上面的測試程序,我們添加了一點中文輸出信息,現在打開控制臺進行調試:

可以看到中文輸出變成了亂碼,我們輸入一些信息進去,這是運行結果:

可以看到,程序內寫入的中文發生了亂碼,而我們的輸入沒有。原因很簡單,輸入時實在linux的控制臺環境下,編碼默認是utf8的,所以我們的輸入被正確編碼,而源文件中的內容是GB18030的,所以在Linux控制臺(默認以utf8解碼數據并顯示)中會發生亂碼。

錯誤的原因知道了解決起來也就很簡單了,把源文件的編碼改成utf8就行,我們選擇最簡單的方法,在高級保存選項中修改編碼(這個菜單選項默認被隱藏,網上有很多介紹如何顯示它的方法的資料):

設置好后保存文件,現在文件的編碼已經被改為了utf8了。

現在運行修改后的程序:

運行結果也是正常的:

使用數學函數和第三方庫

在Linux上使用標準庫提供的數學函數也是一個老生常談的問題,根據你使用cpp還是c會有如下幾個情況:

    使用cpp時,libstdc++依賴于libm,所以使用g++編譯你的程序時會自動鏈接數學函數庫; 使用c時,如果是sqrt(4)這樣的形式,較新的gcc提供了替換措施,不需要顯示鏈接libm; 接上一條,如果你的參數是個變量,那么編譯器可能會選擇需要你鏈接libm。

通常在Windows上我們無需操心這點,但在Linux上使用c語言時就很難忽略這個問題了。

因此保險起見,如果你正在編寫一個使用了數學函數的c程序,那么總是指定連接libm是沒錯的。

另外當你使用例如boost這類第三方庫時,也需要注意。在Windows上我們通常指定好附加包含目錄和附加庫目錄即可正常編譯,但是Linux上必須明確指定鏈接庫的名字,因此我們在項目屬性中進行設置。

在Linux上我們可以使用pkg-config來減輕上述的重復勞動,而在vs中我們不能直接利用這一工具,當你的項目使用了大量第三方庫時就會成為不小的麻煩,如果想要解決這一問題,可以參考后續文章里我會介紹的vs+cmake構建項目。

下面我們給例子加上一點boost chrono的功能測試,在Linux上需要指定-lboost_chrono,這是設置:

下面是完整的代碼:

#include <sys/utsname.h>#include <iostream>#include <cstdio>#include <string>#include <boost/chrono.hpp>int main(){ namespace chrono = boost::chrono; auto start = chrono::high_resolution_clock::now(); utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; std::cout << "輸入內容:"; std::string input; std::cin >> input; std::cout << "你輸入了:" << input << std::endl; auto counter = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start); std::cout << "程序運行了:" << counter.count() << "ms\n";}

點擊運行按鈕,程序就能正常調試了,否則會報錯:

老是有錯的內容來自www.13333515.buzz請勿采集。


  • 本文相關:
  • visual studio 2017通過ssh調試linux上.net core
  • 使用visual studio 2017作為linux c++開發工具
  • 如何關閉http methods中的trace 提高安全意識
  • 查看linux文件的命令詳解
  • centos8.0 網絡配置的實現
  • 利用lynis如何進行linux漏洞掃描詳解
  • centos平臺快速搭建lamp環境的方法
  • linux系統下的時間配置綜述
  • linux內核設備驅動之proc文件系統筆記整理
  • 用dnspod和squid打造自己的cdn (四)
  • centos中tcpwrappers訪問控制實現
  • centos redhat系列對抗ddos之居家必備利器 banip.txt
  • 使用VS2019編譯linux代碼,編譯成功之后如何運行?
  • linux的rhce認證目前國內(2019年)有多少人拿到了?全球呢?
  • 在visual studio 下編程和在Linux下編程(C)有什么區別?能不能直接在vs中寫能夠在linux下運行的代碼?
  • Python 適合在windows還是linux環境下?
  • 使用winpe可以安裝linux操作系統嗎?
  • Linux系統下不小心使用rm命令刪除的文件能有辦法恢復嗎?
  • Linux和Windows的區別
  • 為什么黑客都用linux?
  • Linux運維好找工作嗎?2019年前景怎么樣?
  • Linux系統中一般使用什么語言編程呀?
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全星外虛擬主機華眾虛擬主機linuxwin服務器ftp服務器dns服務器tomcat nginxzabbix云和虛擬化服務器其它首頁服務器linuxvisual studio 2017通過ssh調試linux上.net core使用visual studio 2017作為linux c++開發工具如何關閉http methods中的trace 提高安全意識查看linux文件的命令詳解centos8.0 網絡配置的實現利用lynis如何進行linux漏洞掃描詳解centos平臺快速搭建lamp環境的方法linux系統下的時間配置綜述linux內核設備驅動之proc文件系統筆記整理用dnspod和squid打造自己的cdn (四)centos中tcpwrappers訪問控制實現centos redhat系列對抗ddos之居家必備利器 banip.txtapache開啟.htaccess及.htaccesslinux下實現免密碼登錄(超詳細)service temporarily unavailablapache rewrite url重定向功能的linux下用cron定時執行任務的方法apache性能測試工具ab使用詳解centos 6.4安裝配置lamp服務器(acentos+nginx+php+mysql詳細配置apache you don""t have permissflume環境部署和配置詳解及案例大linux下如何掛載光盤找rpm包的方法步驟解決centos7 安裝騰達u12無線網卡驅動問題linux關機時執行指定腳本功能實現apache2 web服務器的配置步驟分享linux 上在指定時間段內每隔多少分鐘自動linux系統下使用rpm方式安裝最新mysql5.7linux下/etc/passwd文件的選項說明詳解lamp環境搭建linux centos6.5編譯安裝linux系統中sudo命令的十個技巧總結linux時間同步ntp服務的安裝與配置
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.13333515.buzz All Rights Reserved
    3排列五开奖结果