前言
继续进行网站搭建前,作者还进行了VS2017远程连接Linux编译和调试C++的实验,这次的实验比前一篇部署个人博客网站简单很多(PS:准备这篇文章时我的域名提交管局备案还没通过,没有域名导致很多网站配置无法进行= =,所以等待的空闲就唐突插入了这么一篇文章,对跨平台编程感兴趣的可以看看)。
如果使用C/C++语言,有哪些比较好的多平台开发环境呢?作者常听说的是Qt以及安装了插件的VS code,在Windows和Linux系统,甚至一些嵌入式系统的C/C++开发都会使用到它们。虽然它们目前在Linux下的环境也比较友好,但是也限于在有可视化界面的情况下(比如带有桌面的Ubuntu桌面版)。如果你有开发Linux程序的需求,手头的Linux系统只有UbuntuServer这样的纯命令行系统,编程中的一些方便功能比如代码补全、自动语法检查以及方便的插入断点调试等都无法实现,这时候就需要用到远程调试的功能了。借助可视化的windows桌面环境,使用Visual Studio(以下都简称VS)远程连接Linux系统,在windows下编写代码,通过远程的方式进行Linux环境编译以及调试。
开发前的准备
在Linux命令行环境下,编译需要记住一些命令行命令(虽然熟记这些命令是Linux开发必备的技能,但在windows下可以鼠标点点点的操作,多么简单粗暴),想插个断点调试更是难受。VS是一个只在windows下可用的IDE,但是它的强大深入人心,VS2017开始加入了远程调试的功能,Linux系统下代码的开发,包括编写、编译、调试全都可以在VS的可视化界面下进行!为了能够实现远程Linux调试,需要在VS软件和Linux系统中都进行一些准备。接下来的实验都是在我之前虚拟机装UbuntuServer系统教程的基础上进行的,这样保证不会漏掉一些步骤,网上有的教程因为在远程调试前已经装过一些组件,或者使用的云服务器搭载的系统镜像本身在官方Ubuntu镜像集成了一些组件,导致照着操作会由于自己缺一些东西报错,本文尽量在准备工作上避免这些踩雷的地方。
下面正式开始介绍,在微软官网下载VS的在线安装包,我使用的是VS2017,最新的VS2019也可以,差别不是很大。打开安装包,别的可以根据自己需要也安装上,与本文相关的是下面圈红框的这个“使用C++的Linux开发 ”一定要安装上:
安装过程就不介绍了,等待安装完成,启动VS,建立一个Linux项目,在VS左上角选择文件->新建->项目:
弹出新建项目的对话框,安装时如果勾选了安装“使用C++的Linux开发”,现在就可以看到如下分支:
已安装↘
Visual C++↘
跨平台↘
Linux
展开后选中“Linux”分支,在右边选择控制台应用程序(Linux),然后下面指定项目名称和项目的存放位置:
点击确定新建好项目,其实这时可以看到右边有一个选项卡叫“Getting Started”,这个选项卡的内容,是VS用英文介绍配合动图演示的跨平台开发启动流程:
那为什么还要写这篇文章呢?首先肯定有对英语苦手的同学,然后微软这段说明其实还有一些细节需要补充,个人认为这些缺失的细节还是很重要的。
双击左侧项目中唯一的cpp文件“main.cpp”,可以看到自动生成的文件已经为我们写了一小段内容,在终端上打印一条printf语句:
内容咱就不动了,本文内容针对的是配置过程。
首先进行咱们的编译方式和编译机器选择:
在第二排工具栏上可以选择使用Debug还是Release模式编译,前者对代码规范性要求更弱一些,后者检查更加严格,如果不是特别需要的话当然是选择Debug方式编译。
编译机器选择,指的是Linux环境是基于什么架构的,VS提供了x架构和ARM架构两种架构的目标机器。你的芯片是什么架构的,你装的系统就肯定是什么架构的(严格来说,有模拟器可以模拟别的架构芯片运行,我们不做芯片一级的开发,不用考虑这么严谨),所以下面把芯片架构和系统架构混着用了。
ARM和x86是32位的,ARM64和x64是64位的(使用AMD芯片的朋友特别注意一下,这里说的是ARM不是AMD!作者当初也差点看混了。。。AMD我们目前接触到的芯片都是x架构的,AMD是一个芯片公司,而ARM是一种芯片架构!),其他架构的看来太小众了没有支持也没那个必要支持(甚至你现在能不能找到支持那个架构的Linux系统就不好说= =)。你可能好奇自己电脑是不是使用ARM架构的芯片,放心,只要你用windows系统打开了这篇文章在看,你肯定是x架构的,windows系统基本只支持x架构,在Windows上使用的虚拟机用的是宿主机的CPU,所以虚拟机的CPU自然也是x架构。我们个人使用的笔记本和台式机都是Intel和AMD两家的芯片,这两家给个人用的都是x架构。根据虚拟机安装的是32位还是64位选择x86/x64就可以,推荐选择32位的,因为32位程序可以在64位电脑运行,反过来不可以,这也是为了提高兼容性。当然,如果你确实有着性能需要,64位可以满足你的极致性能追求。
为什么要对目标机器架构这么大说特说,而不是像别的教程一样告诉你无脑选x架构就完事了呢?因为作者确实就遇到了选择架构的情况,我在华为云购买的云服务器使用的是华为自研的鲲鹏处理器,这个处理器是ARM架构的,所以我安装系统也只能装ARM架构的,在远程Linux调试也要选择目标机器ARM架构。咱们使用的x架构上开发的软件太多太多了,就光说游戏,如果你换到了ARM架构系统上统统运行不了,因为x架构下的庞大软件生态,个人电脑至今都是x架构占据绝对的统治地位,而服务器由于计算的需要,完全可以摒弃x架构庞大的生态,只需要一些提供网络服务的关键软件能够支持其架构就可以。
总而言之,你使用虚拟机进行实验那么无脑选择x架构就可以,如果使用工控机或者服务器远程连接,要注意一下是否它的芯片是x架构的。
Linux侧,可以使用如下命令查看Linux系统是什么架构的:
uname -a
再次确认了一下,我的虚拟机所安装的UbuntuServer系统是x64的(x64全称就是x86_64,它也兼容x86):
以上就是微软那个“Getting Started”文档(以下都简称文档)的第一步,为Linux开发进行项目的设置。针对我的虚拟机,我选择了Debug和x64选项编译。
接下来第二步,需要远程连接到Linux了,文档里提到,VS只支持远程在Linux目标机器构建项目功能,而且不局限于某个具体的Linux发行版,但是依赖一些工具。这里特别说明一下,微软为什么要提到“仅”支持远程编译呢?因为你现在看到的VS环境对Linux项目进行编译,其实是把你的工程传送到了装Linux系统目标机器的指定位置,调用的编译工具和调试工具都是Linux下的,VS只是把编译结果和调试时的输出远程反馈回来,显示给你,真正实现这些工作的还是Linux的一些组件工具,VS本身并没有集成Linux环境的编译器和调试器。所以实现远程Linux,要在Linux上安装一些工具:openssh-server, g++, gdb 和 gdbserver,第一个是远程连接到Linux电脑需要在Linux端安装的工具,就算不使用VS,要使用别的远程连接客户端远程到Linux电脑也需要这个工具,g++就是Linux下用到的C++编译器了,最后两个是Linux调试C++的调试器。
Linux侧,安装很简单,先进入root用户:
su root
安装之前先检查下更新:
apt update
apt upgrade -y
然后全部安装即可:
apt-get install openssh-server g++ gdb gdbserver -y
检查一下网卡的IP地址,为了接下来的连接:
ifconfig
如果上面的命令执行不了,需要安装一下Linux网络工具:
apt install net-tools
我的虚拟机网卡IP是192.168.25.133:
建立远程连接并进行编译和调试
回到VS上,第一次连接Linux服务器,我们需要提供一些信息,如果Linux不变动以后的远程调试就不用修改这些信息,启动Linux后VS就可以直接连接了。
在工具栏选择工具->选项然后单击:
弹出的对话框有很多选项,我们在左侧找到跨平台->连接管理器,点击后右侧就可以添加/删除/更改远程连接的信息了:
点击添加,弹出如下对话框,其中主机名输入刚才使用ifconfig查到的网卡IP地址,端口因为是远程连接,填22,用户名是Linux系统下自己的用户名,我的是lww,身份验证类型选择密码,最后输入lww的密码:
点击连接就开始同步Linux下的标头了,即使是虚拟机,这个过程也可能要等上几分钟,因为需要远程下载大量文件。为什么要同步Linux下的标头呢?其实这个过程是把Linux下使用的g++编译器一些头文件复制到VS下,这样VS有了Linux下的头文件就可以进行变量和函数自动补全和一些类型检查了。
如果Linux不安装前面提到的几个工具,就会出现类似下面的错误,所以一定要按照步骤操作呦:
出现错误了,只要不是提示密码或者IP有问题,提示找不到XX程序,在Linux下安装一下就可以了。
如果有错误,排除之后删除掉添加的连接重新添加和连接一遍,然后等待连接完毕,“连接到远程系统”自动关闭,可以看到连接管理器里多了一个添加好的连接:
这时还可以看到左侧的连接管理器下面多了一个分支,叫远程标头管理器,如果Linux下的头文件有更新,你可以在这里手动更新一下:
如果有多个Linux电脑远程连接,如何选择自己的工程在哪个电脑编译和调试呢?在VS“解决方案资源管理器”选项卡选中工程名,然后在VS工具栏选中项目->XX属性(XX是你的工程名):
弹出工程属性设置对话框,刚打开默认在“常规”设置下:
右边的远程生成根目录就是说咱们的工程会复制到Linux系统的哪个目录下,默认是在“~/projects”,这个~就是用户的家目录,对于lww来说表示/home/lww,也就是对于我来说,工程的具体位置是/hmoe/lww/projects/MyLinuxTest。这里提个醒,可以看到VS远程调试后会在Linux下留下源代码,如果编译完不想让别人看到源代码,一定要记得把生成的可执行文件拷出来并把工程删掉!
“远程生成计算机”这里就可以选择具体是远程到哪台Linux电脑:
选择刚才添加好连接的那个Linux电脑,然后点击应用,确定,关闭对话框。
其他还有很多编译选项可以设置,这里挑个最关键的说一下,选择语言的版本,我们都知道C和C++有不同的标准,在C/C++下面的“语言”这里可以很方便的选择编译器所采用的语言标准:
回到VS主界面,现在就可以进行编译和调试啦!在工具栏选择生成->生成解决方案:
VS界面下方就可以看到生成过程输出的消息了,我们的第一个Linux程序编译成功啦!
点击这个位置开始调试:
由于我们这个程序打印完消息就结束了,先加一个断点让它暂停:
再次点击刚才的按钮开始调试:
在VS界面最下方,有一个Linux控制台窗口,它接管了Linux系统上的控制台输出,可以看到成功打印出了消息!而且可以利用VS强大的监视工具监视运行中的变量,我们的第一个Linux程序到此就开发完毕了!
如果想在Linux下运行一遍,首先进入工程目录(根据自己的配置请自行更改这一条命令):
cd /home/lww/projects/MyLinuxTest/bin/x64/Debug
然后运行:
./MyLinuxTest.out
我们的程序在Linux下也正常输出了!
至此我们学习了VS下远程连接Linux的方法,使用示例程序进行了演示,如果需要进一步的开发,就不需要特地在Linux系统中编程啦!