由于前段时间正好买了一个服务器来跑Tensorflow的推理模型,所以借这个机会把Linux的开发也一并补上。
先声明我的服务器是Ubuntu16.04,下面文章的内容也是基于Ubuntu16.04的。为什么标题要写Linux呢?原因是我也开发过Raspbian(Debian)和CentOS,这些系统除了安装软件插件命令有些变化以外,开发过程并没有什么不同,应该可以通用。
这部分内容我认为微软的官方文档已经写的非常全面了,下面文章我就多展示图片,少写字,详细参看微软的官方文档。
官方文档: https://docs.microsoft.com/en-us/cpp/linux/?view=vs-2019 英文
https://docs.microsoft.com/zh-cn/cpp/linux/?view=vs-2019 中文
1. 增加Linux的工作负载
先打开Visual Studio Installer
选中“使用C++的Linux开发”
点击修改,等待安装结束。
2. 创建LinuxC++项目
选择控制台就可以。
3. 配置Linux服务器
VS需要Linux安装以下几个软件包:openssh-server, g++, gdb and gdbserver。
在Ubuntu下的命令是这样的:sudo apt-get install openssh-server g++ gdb gdbserver(这个命令随着不同系统的Package Manager变化。)
补充下,这个命令在服务器都是远程登陆后发送的(服务器都默认开启了SSH),如下:
像树莓派这样的Linux设备不一定就开启了。第一步需要先开启SSH,第二步再配置好网络连接。可以参考这一篇文章:https://blog.csdn.net/blue_zy/article/details/79840686
我推荐使用WinSCP+Putty的方式来进行Linux远程控制,网页连接的始终不方便。而且这两个软件都是免费的。
WinSCP下载地址:https://winscp.net/eng/download.php
Putty下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
补充:WinSCP+Putty的配置
WinSCP这个软件最强大的地方是可以像Windows系统一样直接拖动或者复制粘贴的方式来管理远程Linux的文件系统。如下:
下载安装好了WinSCP之后,先配置新的会话,也就是目标的Linux连接:
注意主机名是ip地址,用户名的话看具体系统,一般都是root。
然后为WinSCP添加Putty。Putty下载好以后应该就是一个独立运行的程序,不需要安装。把putty.exe文件拷贝到WinSCP下面的PuTTY的子文件夹当中。
然后再增加PuTTY和WinSCP间的密码共享(否则每次打开PuTTY还需要再登录一次):
用PuTTY有个好处就是命令可以在Windows里面复制,然后直接在PuTTY里面右键粘贴。
4. 在VS中添加远程Linux目标
如果是这样,那就是配置成功了,正在更新头文件的索引Cache(将远程的头文件下载到本地,方便开发时查看头文件):
一切完成后是这样的:
这个Getting Started网页下有完整的操作流程,如果觉得我的流程不够清楚的可以再看一次。
如果不小心关闭了也没关系,这个网页在项目的readme文件夹下面,用浏览器打开就行:
5. 如果到这步都没有什么问题出现,就可以直接运行程序了
点击运行并调试
这一个按键实际上的功能如下:
复制源文件到远程Linux系统,启动远程的g++编译。实际上VS2019的作用就是转发命令而已。曾经有人和我讨论VS开发Linux项目弊端,他说在Linux上直接开发可以利用服务器的硬件优势加速项目的编译速度,实际上使用VS开发也是Linux进行本地编译的。这是微软的原话:When building on remote systems, the source files on your development PC are copied to the Linux computer and compiled there.即使用在步骤2中下载的g++工具集来完成编译。
编译完成以后,调用了远程运行以及启动远程gdb的调试。如果就当前的代码,点击运行调试后你只会看到如下的内容,并不会看到那句hello:
这里显示的是远程的shell命令,没看到hello输出的原因是,还有个Linux输出窗口只出现了一瞬间就由于程序结束而消失了。
在调试里面可以选择让这个命令窗口一直显示,这样就可以看到远程Linux系统运行后在控制台的打印信息:
修改代码后再运行试试:
6. 远程调试
这个就是为什么我推荐使用VS开发Linux了,和调试Windows一样的,直接加断点就行了。
进程,线程,堆栈帧,内存视图这些神器全都在。
7. 查看下远程部署的程序
8. 用PuTTY运行下生成的控制台程序
跳转到生成文件目录: cd /root/projects/LinuxConsole/bin/x64/Debug
运行.out文件:./LinuxConsole.out
实际上Linux下运行文件是不需要.out后缀的,我想这个后缀应该是VS加上用来区分的吧。
9. 不知不觉12点了,简单介绍下项目属性,剩下就去看微软的文档吧(比如创建和调试Linux 的Cmake项目)
这里区分下GCC和G++:
GCC是GNU Compiler Collection的缩写。同时也有种缩写叫GNU C Compiler,也是GCC。所以网上会有这么个说法:GCC编译C语言,G++编译C++。这个句话有两个错误,一个是GCC有两种指向,另一个是G++也可以编译C语言。
我在上图中写的是GCC是g++的工具集,GCC不止支持C++一种语言,C, C++, Objective-C, Ada, Fortran, Java and treelang这些都支持,这就是为啥叫Collection 集合的原因。
原文解释在这里:http://gcc.gnu.org/onlinedocs/gcc-3.3.5/gcc/G_002b_002b-and-GCC.html