vs2017搭建linux c++开发环境
最近一直在阅读ovs的源码,看到用户态代码的时候,需要对用户态的代码进行调试,一开始想直接使用linux中的GDB进行调试,但是ovs的工程太过于复杂,从网上找了些文章,发现vs2017能够支持linux c++程序的调试,捣鼓了一下午,遇到了一些坑,终于搭建好了开发环境。
最新版的vs 2017支持linux环境编程,与传统vs上的windows编程不同的是,vs2017 所需要的Linux环境需要搭载在一个linux的服务器上,vs 2017 相当于将windows系统和这个linux系统之间建立了某种映射,可以将代码复制到linux中对应的目录中,并且windows系统中的vs 2017能够看到运行的情况,甚至是对代码进行断点调试。
开发环境
window 10操作系统,vs 2017 community版,VMware12.5.7
在VMware中安装ubuntu14桌面版
vs 2017的安装
官网下载地址https://visualstudio.microsoft.com/zh-hans/?rr=https%3A%2F%2Fwww.microsoft.com%2Fzh-cn%2F
从官网下载最新的vs 2017,在安装的过程中需要注意,如果你需要搭建linux c++环境,需要勾选“使用c++的linux开发”工具集,见下图

配置ubuntu环境
在ubuntu中安装好c++环境,因为vs 2017需要通过ssh登陆ubuntu系统,所以也需要安装好ssh服务,命令如下:
sudo apt-get install openssh-server g++ gdb gdbserver
开始ssh服务:
sudo service ssh start
vs2017创建linux项目
打开vs2017,步骤如下,文件-->新建项目-->跨平台-->linux->控制台应用程序(linux)

新建完成项目之后,vs2017自动生成一个简单的maic.cpp文件
菜单栏选择 调试->cross platform->add 将刚才建立的Ubuntu服务器用户信息输入进去

右键解决方案,可以看到当前程序的属性页面,点击配置属性->常规->远程生成计算机,选择刚刚新建的账户,可以看到,在该页面下,默认的远程生成根目录在"~/projects"下面,待会儿可以看到在ubuntu对应的目录下会生成项目的代码。

菜单栏选择调试->Linux Console打开linux程序的控制台

可以在程序中打断点,点击调试按钮进行运行,可以看到控制台打印出信息

登陆ubuntu,在~/projects目录下面可以看到新生成的项目文件夹“test”

遇到问题
上述是一个简单的开发演示,在实际的工作中,代码可能很复杂。因为这几天在学习linux的IO多路复用机制,从网上找了一个稍微复杂的通信程序,代码来自于博客https://www.cnblogs.com/Anker/p/3261006.html,源代码有一处错误,需加上#include <arpa/inet.h>。这个程序的功能是客户端向服务器发送信息,服务器接收输出并原样发送回给客户端,客户端接收到输出到终端。其中使用一些linux中的库文件。
问题1 无法找到库文件
在博客https://www.cnblogs.com/xylc/p/6533716.html?&from=androidqq 看到一个解决方法,将ubuntu下面/usr/include、/usr/local/include等目录复制到vs的linux header path(在我的机器中,地址为C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Linux\include\usr)。
问题2 gdbserver模式无法使用
vs2017进行调试有两种方式,gdb和gdb-server,可以在菜单栏 调试->配置属性->调试->调试模式中进行配置,关于这两种模式的不同,官方文档的解释如下:
- 在“gdbserver”模式中,GDB 在本地运行,连接到在远程系统上运行的 gdbserver。 请注意,这是 Linux 控制台窗口唯一支持的模式。
- 在“gdb”模式中,Visual Studio 调试器驱动远程系统上的 GDB,如果 GDB 的本地版本与目标计算机上安装的版本不兼容,则远程系统上的 GDB 更易兼容。 |
从网上找了很多的资料,重新更新了ubuntu中的gdbserver,结果还是不行,因为我之前使用的是ubuntu17的server版本,无奈使用ubuntu14的桌面版,问题立马得到解决,目前仍然不知道gdbserver模型为什么无法使用,如果有路过的大神看到,希望评论区可以留言。
问题3 错误Stopped (tty input)
在运行gdb模式下运 行客户端的时候,客户端从控制台接受数据的那一段代码报Stopped (tty input)错误,通过看官方文档发现gdb模式不支持控制台交互,改成gdbserver模式后能正常使用。
最终运行结果
最终成功运行服务端和客户端程序,先启动服务端,再运行客户端,下图中分别为服务端和客户端运行情况。当客户端再控制台输入信息,服务端能接收,并回传给客户端在控制台显示。


参考资料
部署、运行和调试 Linux 项目
使用Visual Studio 2017作为Linux C++开发工具
作者:yearsj
转载请注明出处:https://www.cnblogs.com/yearsj/p/9600682.html
segmentfault对应博文:https://segmentfault.com/a/1190000016300215
vs2017搭建linux c++开发环境的更多相关文章
- DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境
DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境 笔者使用ubuntu64位LINUX 首先必须保证LINUX可以连互联网. 安装MYSQLsudo apt-get update ...
- 为.NET搭建Linux的开发环境,鄙视那些将简单事情复杂化的人
写在前面的吐槽 原本跨平台开发很容易的事情, 很多人把它弄得很麻烦,给外人的感觉:你们.NET跨平台开发好不成熟,好麻烦哦. ..................................... ...
- [图文教程]VS2017搭建opencv & C++ 开发环境
首先从官网下载OpenCV最新版本 截至我写这文章,4.0已经发布预览版了,不过在这是没有的,只能用3.4.2: https://opencv.org/releases.html 一:安装 安装过程不 ...
- visual studio 2017搭建linux c++开发环境
https://blog.csdn.net/cekonghyj/article/details/77917433 https://blog.csdn.net/norsd/article/details ...
- Linux PC开发环境搭建建议
搭建Linux PC开发环境 很早之前整理的在Linux(ubuntu)系统下搭建 PC开发环境的工具的推荐和简单说明,尽管现在有些已经不再使用,但还是要备份一下,作为以后的参考: package: ...
- windows和linux中搭建python集成开发环境IDE——如何设置多个python环境
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- win10子系统linux.ubuntu开发环境搭建
移步新博客... win10子系统linux.ubuntu开发环境搭建
- LINUX下搭建JAVA的开发环境
LINUX下搭建JAVA的开发环境 (2009-07-13 10:04:13) 下面就将Linux下JAVA开发环境的搭建详细道来: 1.Linux下JDK的安装 至于下载JDK的二进制可执行 ...
随机推荐
- ES module 实现方式
随着js社区不断发展,js功能更加强大,细数js的几种 module 方式. 整理了七种模块化方式 1.作为新手,练习小的demo,比较喜欢的方式.不适合大的项目. <!--html--> ...
- Linux下设置共享目录
Linux系统的文件或目录的共享功能是非常强大,而且是非常灵活的,其对权限的控制可以做到非常的细致,当然如果你是通过命令行方式进行设置的 话,那么对于刚接触linux系统的用户来说将是一件十分头痛的事 ...
- Redis事件
Redis事件 Redis的ae(Redis用的事件模型库) ae.c Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与 ...
- PHP中实现中文字串截取无乱码的方法
[本文转自独占神林的日志:链接:http://yuninglovekefan.blog.sohu.com/176021361.html] 在PHP中,substr()函数截取带有中文字符串的话,可能会 ...
- Home Assistant系列 -- 接入手机摄像头做实时监控和人脸识别
准备一部废旧(土豪忽略,主要是穷)的.摄像头还是好的手机做监控设备,(Android 和iPhone都行)当Home Assistant 获得实时的视频流后,可以接入各种图像处理组件完成人脸识别,动作 ...
- sqli-labs (less-8-less-10)
盲注需要掌握一些MySQL的相关函数:length(str):返回str字符串的长度.substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回.注意这里的pos ...
- U盘,移动硬盘显示显示需要格式化怎么修复
冷静别怕,用windows系统自带磁盘修复CHKDSK命令即可解决此问题. 首先,在开始菜单栏站到“运行”窗口,也就是c:\(命令提示符),win7可直接在开始菜单的搜索窗口中输入“cmd”. 其次, ...
- LIFO栈 ADT接口 链表实现
LIFO 链栈结构 typedef int ElemType; struct node{ ElemType data; struct node* next; }; typedef struct nod ...
- 实现虚拟机和宿主机之间的复制、粘贴(ubuntu系统)
参考:https://blog.csdn.net/weixin_37850264/article/details/79057886 https://blog.csdn.net/zldz14/artic ...
- C# typeof() 和 GetType()区是什么
1.typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称. 2.GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof() ...