偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用 VS 2019進(jìn)行Linux遠(yuǎn)程開(kāi)發(fā)

系統(tǒng) Linux
雖然我自己是在Linux環(huán)境上直接進(jìn)行開(kāi)發(fā)的,但也有許多的人是在Windows環(huán)境上從事開(kāi)發(fā)工作的,如果離開(kāi)自己熟悉的系統(tǒng)到陌生的環(huán)境上也許會(huì)影響到工作效率。

[[266319]]

通常,當(dāng)我們開(kāi)發(fā)Linux程序時(shí)有兩種方案:

  • 在Linux上直接編寫(xiě)程序并進(jìn)行運(yùn)行測(cè)試和調(diào)試
  • 在Windows或Mac OS X上借助工具進(jìn)行遠(yuǎn)程開(kāi)發(fā)

雖然我自己是在Linux環(huán)境上直接進(jìn)行開(kāi)發(fā)的,但也有許多的人是在Windows環(huán)境上從事開(kāi)發(fā)工作的,如果離開(kāi)自己熟悉的系統(tǒng)到陌生的環(huán)境上也許會(huì)影響到工作效率。

因此今天我們就來(lái)看下如何在Windows上使用Visual Studio 2019進(jìn)行Linux遠(yuǎn)程開(kāi)發(fā)以及如何避免常見(jiàn)的陷阱。

Visual Studio的跨平臺(tái)開(kāi)發(fā)功能簡(jiǎn)介

從Visual Studio 2017開(kāi)始微軟推出了VS的跨平臺(tái)開(kāi)發(fā)功能,你可以在VS中編輯代碼,隨后進(jìn)行跨平臺(tái)編譯和遠(yuǎn)程調(diào)試,將原先我們需要手動(dòng)完成的工作進(jìn)行了自動(dòng)化,大幅減輕了我們的負(fù)擔(dān)。其中支持的平臺(tái)包括Android和Linux,也就是我們今天要重點(diǎn)介紹的主角。

也許你會(huì)好奇,VS究竟是怎樣進(jìn)行遠(yuǎn)程開(kāi)發(fā)的,雖然你不用了解這些知識(shí)也可以進(jìn)行開(kāi)發(fā),但我還是希望能用兩分鐘做個(gè)簡(jiǎn)短的解釋。

VS進(jìn)行遠(yuǎn)程開(kāi)發(fā)分為兩步:

  1. 創(chuàng)建遠(yuǎn)程環(huán)境的連接,隨后讓vs將遠(yuǎn)程環(huán)境中的系統(tǒng)頭文件同步到本地(也可以指定其他地方的頭文件,后面會(huì)講解),c++的代碼補(bǔ)全只需要頭文件即可。
  2. 當(dāng)代碼寫(xiě)好后,選擇合適的遠(yuǎn)程環(huán)境,vs將目標(biāo)文件和代碼復(fù)制到遠(yuǎn)程環(huán)境的指定位置,接著根據(jù)你的配置進(jìn)行編譯。
  3. 隨后vs將會(huì)在console的gdb或gdbserver中運(yùn)行你的程序,在此期間你可以充分享受vs debugger帶來(lái)的高效和便利。

經(jīng)過(guò)上述步驟之后你就可以在vs里調(diào)試自己編寫(xiě)的跨平臺(tái)程序了。

使用 VS 2019進(jìn)行Linux遠(yuǎn)程開(kāi)發(fā)

簡(jiǎn)介到此結(jié)束了,下面我們來(lái)看看在VS 2019進(jìn)行Linux開(kāi)發(fā)的圖文教程。在我們開(kāi)始之前,首先要做點(diǎn)準(zhǔn)備工作:

  1. 安裝好VS 2019,且勾選了C++ for Linux功能;
  2. 準(zhǔn)備一個(gè)可用的Linux遠(yuǎn)程環(huán)境,例如配置了靜態(tài)IP的Linux虛擬機(jī),并且已經(jīng)安裝好了GCC工具鏈以及openssh。

做好準(zhǔn)備后我們就該進(jìn)入正題了。

創(chuàng)建項(xiàng)目

安裝好C++ for Linux功能后我們會(huì)在創(chuàng)建新項(xiàng)目的面板中看到Linux的選項(xiàng),如圖:

這里我們選擇了使用傳統(tǒng)的vs項(xiàng)目解決方案構(gòu)建的空白控制臺(tái)程序,后續(xù)的文章中你還可以看到如何創(chuàng)建cmake項(xiàng)目,這里暫且不提。

下面沒(méi)什么要說(shuō)的,選擇項(xiàng)目的存儲(chǔ)位置,注意是本地的位置,遠(yuǎn)程機(jī)器的位置在后面會(huì)進(jìn)行配置:

點(diǎn)擊創(chuàng)建,我們的遠(yuǎn)程開(kāi)發(fā)項(xiàng)目就創(chuàng)建成功了。

配置遠(yuǎn)程項(xiàng)目

VS不能編輯空項(xiàng)目的配置,所以我們先在項(xiàng)目中創(chuàng)建一個(gè)main.cpp,然后點(diǎn)擊頂部菜單:項(xiàng)目->屬性,你就能看到項(xiàng)目的配置界面了:

遠(yuǎn)程計(jì)算機(jī)是在調(diào)試中的遠(yuǎn)程連接管理器中添加的。這里一般不需要改動(dòng),除非你需要改變項(xiàng)目的類(lèi)型或編譯結(jié)果的存放位置。如果有多個(gè)遠(yuǎn)程環(huán)境時(shí),也可以在這里進(jìn)行選擇。

調(diào)試部分提供了gdb和gdbserver,前者是讓VS在Linux上啟動(dòng)一個(gè)console,然后在其中運(yùn)行g(shù)db并返回輸出,如果你的Linux上的終端配置了彩色輸出,那么和遺憾vs并不認(rèn)識(shí)他們,會(huì)顯示成原始的字符串;

使用gdbserver時(shí)會(huì)在遠(yuǎn)程啟用gdbserver 本地VS解析回傳的數(shù)據(jù)不會(huì)出現(xiàn)雜音。

這里我們選擇了gdbserver,如果你發(fā)現(xiàn)無(wú)法打斷點(diǎn),那么參考微軟的建議,換回gdb方案:

接著是配置的重點(diǎn),首先是配置需要同步的遠(yuǎn)程環(huán)境的頭文件,有了這些文件vs才能對(duì)你的代碼進(jìn)行自動(dòng)補(bǔ)全和提示:

默認(rèn)復(fù)制的路徑通常已經(jīng)包含了Linux上大部分的頭文件,通常我們也不需要做更改。頭文件的同步發(fā)生在***次構(gòu)建項(xiàng)目成功后或添加遠(yuǎn)程連接后手動(dòng)同步。

接著是C/C++編譯器的選擇,也就是對(duì)gcc和g++編譯參數(shù)的配置,講解這些參數(shù)超出了我們的討論范圍,我們這里只需要選擇合適的C++標(biāo)準(zhǔn)版本:

這里我們選擇了c++17。其他設(shè)置與在Windows上進(jìn)行開(kāi)發(fā)時(shí)一樣,vs可以自動(dòng)轉(zhuǎn)換成g++的參數(shù),這里就不再贅述。

添加遠(yuǎn)程環(huán)境

有了遠(yuǎn)程環(huán)境我們才能同步頭文件或者進(jìn)行調(diào)試運(yùn)行。

在***次編譯或調(diào)試你的項(xiàng)目時(shí)vs會(huì)自動(dòng)讓你連接遠(yuǎn)程環(huán)境,當(dāng)然,我們推薦在調(diào)試->選項(xiàng)->跨平臺(tái)->連接管理器中進(jìn)行設(shè)置:

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

登錄成功后這個(gè)連接就添加完成了,我們看到管理器下面還有一個(gè)遠(yuǎn)程標(biāo)頭管理器的設(shè)置項(xiàng),這就是用來(lái)同步頭文件的:

點(diǎn)擊更新按鈕就會(huì)開(kāi)始同步頭文件,這些文件會(huì)被緩存在本地,因?yàn)橐獜倪h(yuǎn)程一次性復(fù)制大量文件,所以可能會(huì)花費(fèi)較長(zhǎng)的時(shí)間。

這樣遠(yuǎn)程環(huán)境就添加好了,可以開(kāi)始寫(xiě)代碼了。

本地編寫(xiě)和遠(yuǎn)程調(diào)試

至此你已經(jīng)可以在VS中編寫(xiě)面向Linux平臺(tái)的代碼了,自動(dòng)補(bǔ)全可以正常工作:

可以看到Linux中的頭文件和結(jié)構(gòu)體都已經(jīng)可以識(shí)別了。如果你發(fā)現(xiàn)無(wú)法自動(dòng)補(bǔ)全(通常發(fā)生在剛添加遠(yuǎn)程連接或是項(xiàng)目設(shè)置發(fā)生了變化后),先試試關(guān)閉vs重新打開(kāi),如果沒(méi)用請(qǐng)嘗試刷新intellisense或重新同步頭文件。

在編輯結(jié)束后我們就能點(diǎn)擊調(diào)試按鈕運(yùn)行我們的程序了:

注意,構(gòu)建的體系架構(gòu)必須是和遠(yuǎn)程環(huán)境一致的,比如遠(yuǎn)程環(huán)境是x64,這里可以選擇x64或x86,但是不能選擇arm,否則會(huì)報(bào)錯(cuò)。

這是測(cè)試代碼,它將輸出當(dāng)前Linux系統(tǒng)內(nèi)核的版本:

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

點(diǎn)擊調(diào)試->Linux 控制臺(tái),會(huì)顯示一個(gè)可以交互的console,你可以在其中輸入內(nèi)容或是看到程序的輸出:

程序運(yùn)行成功。

避免踩坑

遠(yuǎn)程編譯順利完成后,我們就可以接著利用vs debugger設(shè)置斷點(diǎn),在斷點(diǎn)處查看變量,甚至對(duì)運(yùn)行中的Linux進(jìn)行動(dòng)態(tài)性能分析了。

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

中文亂碼

編碼問(wèn)題帶來(lái)的麻煩永遠(yuǎn)會(huì)被放在***位,畢竟當(dāng)人們看到預(yù)想的輸出實(shí)際上是一堆亂碼時(shí)總會(huì)不可避免得緊張起來(lái)。

眾所周知,編碼問(wèn)題一直是老大難,特別是Windows上中文環(huán)境通常是GB18030或GBK,而Linux上統(tǒng)一為utf8時(shí)。

下面看個(gè)實(shí)際例子,通常我們的程序里只包含ASCII字符的話(huà)不容易產(chǎn)生問(wèn)題,所以我們加上一點(diǎn)中文字符:

  1. #include <sys/utsname.h> 
  2. #include <iostream> 
  3. #include <cstdio> 
  4. #include <string> 
  5.  
  6. int main() 
  7.     utsname names; 
  8.     if (uname(&names) != 0) { 
  9.         std::perror("cannot get unames"); 
  10.     } 
  11.     std::cout << "Linux kernel version: " << names.release << std::endl; 
  12.     std::cout << "輸入內(nèi)容:"
  13.     std::string input; 
  14.     std::cin >> input; 
  15.     std::cout << "你輸入了:" << input << std::endl; 

對(duì)于上面的測(cè)試程序,我們添加了一點(diǎn)中文輸出信息,現(xiàn)在打開(kāi)控制臺(tái)進(jìn)行調(diào)試:

可以看到中文輸出變成了亂碼,我們輸入一些信息進(jìn)去,這是運(yùn)行結(jié)果:

可以看到,程序內(nèi)寫(xiě)入的中文發(fā)生了亂碼,而我們的輸入沒(méi)有。原因很簡(jiǎn)單,輸入時(shí)實(shí)在linux的控制臺(tái)環(huán)境下,編碼默認(rèn)是utf8的,所以我們的輸入被正確編碼,而源文件中的內(nèi)容是GB18030的,所以在Linux控制臺(tái)(默認(rèn)以u(píng)tf8解碼數(shù)據(jù)并顯示)中會(huì)發(fā)生亂碼。

錯(cuò)誤的原因知道了解決起來(lái)也就很簡(jiǎn)單了,把源文件的編碼改成utf8就行,我們選擇最簡(jiǎn)單的方法,在高級(jí)保存選項(xiàng)中修改編碼(這個(gè)菜單選項(xiàng)默認(rèn)被隱藏,網(wǎng)上有很多介紹如何顯示它的方法的資料):

設(shè)置好后保存文件,現(xiàn)在文件的編碼已經(jīng)被改為了utf8了。

現(xiàn)在運(yùn)行修改后的程序:

運(yùn)行結(jié)果也是正常的:

使用數(shù)學(xué)函數(shù)和第三方庫(kù)

在Linux上使用標(biāo)準(zhǔn)庫(kù)提供的數(shù)學(xué)函數(shù)也是一個(gè)老生常談的問(wèn)題,根據(jù)你使用cpp還是C會(huì)有如下幾個(gè)情況:

使用cpp時(shí),libstdc++依賴(lài)于libm,所以使用g++編譯你的程序時(shí)會(huì)自動(dòng)鏈接數(shù)學(xué)函數(shù)庫(kù);

使用c時(shí),如果是sqrt(4)這樣的形式,較新的gcc提供了替換措施,不需要顯示鏈接libm;

接上一條,如果你的參數(shù)是個(gè)變量,那么編譯器可能會(huì)選擇需要你鏈接libm。

通常在Windows上我們無(wú)需操心這點(diǎn),但在Linux上使用c語(yǔ)言時(shí)就很難忽略這個(gè)問(wèn)題了。

因此保險(xiǎn)起見(jiàn),如果你正在編寫(xiě)一個(gè)使用了數(shù)學(xué)函數(shù)的c程序,那么總是指定連接libm是沒(méi)錯(cuò)的。(具體可以參考http://www.linuxforums.org/forum/programming-scripting/125526-c-gcc-math-h-lm.html)

另外當(dāng)你使用例如boost這類(lèi)第三方庫(kù)時(shí),也需要注意。在Windows上我們通常指定好附加包含目錄和附加庫(kù)目錄即可正常編譯,但是Linux上必須明確指定鏈接庫(kù)的名字,因此我們?cè)陧?xiàng)目屬性中進(jìn)行設(shè)置。

在Linux上我們可以使用pkg-config來(lái)減輕上述的重復(fù)勞動(dòng),而在vs中我們不能直接利用這一工具,當(dāng)你的項(xiàng)目使用了大量第三方庫(kù)時(shí)就會(huì)成為不小的麻煩,如果想要解決這一問(wèn)題,可以參考后續(xù)文章里我會(huì)介紹的vs+cmake構(gòu)建項(xiàng)目。

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

下面是完整的代碼:

  1. #include <sys/utsname.h> 
  2. #include <iostream> 
  3. #include <cstdio> 
  4. #include <string> 
  5. #include <boost/chrono.hpp> 
  6.  
  7. int main() 
  8.     namespace chrono = boost::chrono; 
  9.     auto start = chrono::high_resolution_clock::now(); 
  10.     utsname names; 
  11.     if (uname(&names) != 0) { 
  12.         std::perror("cannot get unames"); 
  13.     } 
  14.  
  15.     std::cout << "Linux kernel version: " << names.release << std::endl; 
  16.     std::cout << "輸入內(nèi)容:"
  17.     std::string input; 
  18.     std::cin >> input; 
  19.     std::cout << "你輸入了:" << input << std::endl; 
  20.     auto counter = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start); 
  21.     std::cout << "程序運(yùn)行了:" << counter.count() << "ms\n"

點(diǎn)擊運(yùn)行按鈕,程序就能正常調(diào)試了,否則會(huì)報(bào)錯(cuò):

責(zé)任編輯:武曉燕 來(lái)源: 博客園
相關(guān)推薦

2023-11-21 16:29:06

2018-09-08 09:25:05

編程語(yǔ)言PythonVS Code

2018-10-10 14:21:06

Python 工具程序員

2009-12-11 14:16:11

VS2010 Ulti

2009-12-15 13:27:34

VS開(kāi)發(fā)環(huán)境

2010-07-02 12:58:39

Meego開(kāi)發(fā)

2019-05-05 07:05:09

微軟開(kāi)發(fā)VS Code

2019-09-29 09:40:20

LinuxWindowsMacOS

2021-08-22 17:22:31

VS Code容器開(kāi)發(fā)人員

2009-11-19 13:36:45

2022-07-11 09:39:49

微軟后端服務(wù)遠(yuǎn)程開(kāi)發(fā)

2009-12-11 16:15:01

VS2008功能

2011-01-18 08:55:20

IntelliTracVS2010

2022-11-03 08:35:35

2014-12-25 10:15:37

DockerJava

2010-09-14 09:15:03

RsyncLinux備份遠(yuǎn)程數(shù)據(jù)同步

2022-05-07 11:08:50

Linuxapt 命令

2022-05-04 11:10:58

Linuxdnf 命令

2022-02-09 15:29:35

Java組件編程語(yǔ)言

2011-07-18 10:21:04

iOS Visual Stu iphone
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)