visual studio 2015下使用gcc调试linux c++开发环境搭建完整详解
一直以来,相信绝大部分的开发都是windows/mac下做开发,尤其是非嵌入式和qt系的,而开源服务器程序绝大部分都是跑在Linux下,几乎就没有跑在windows下的。一直以来开发人员都是在windows下调试好非平台相关部分,然后到具体环境下去调试平台相关接口。
有着宇宙第一IDE之称的VS自从萨提亚·纳德拉上台之后,vs 2017正式支持跨平台开发,可是vs 2017听说太巨无霸了,安装好要几十个GB。而且之前只装了vs 2015,后来偶然搜到了翻译了msdn官网的帖子,vs 2015有linux c++开发的插件。太爽了。。下面来搭建一把。。
为了使用便捷:
1、首先确保装了小番茄;
2、禁用字符串和注释中的拼写错误。
3、安装visual gdb插件(远程debug应用,我都是用这个,非常好用)。
4、安装astyle,配置格式化。
1)、工具-》扩展和更新,搜astyle插件,下载安装重启,当前是2.0版本。
2)、工具-》选项-》AStyle Formatter-》Edit,填入下面的,点击save,确定。
--style=allman --indent=spaces=4 --indent-switches --indent-namespaces --break-blocks --pad-oper --unpad-paren --delete-empty-lines --convert-tabs --mode=c
说明:
--indent=spaces=4 行缩进用4个空格
--indent-switches switch 与case不同列,case缩进
--indent-cases 缩进case下面的语句,我不喜欢
--break-blocks 空行分隔无关块
--delete-empty-lines 删除多余空行
--pad-oper 操作符两端出入空格
--unpad-paren 移除括号两端多余空格
--convert-tabs tab转空格
其次,我应该告诉你去看https://blogs.msdn.microsoft.com/vcblog/2017/04/11/linux-development-with-c-in-visual-studio/就好。
注:我猜可能是因为垄断的原因,vs 2017自带的跨平台开发或者vs 2015的visual c++ for linux插件远不如visualgdb好用,它支持make/cmake以及各种profiler,正式开发就应该必备小番茄和visualgdb,效率倍增。本文还是以visual c++ for linux插件为例。
第三,我需要告诉你的是msdn忽略了以及网络上找不到直接答案的关键性信息。安装好插件以及配置好ssh之后,别忙着测试,否则可以让你折腾好一会儿。
- 卸载linux自带的gdb,下载gdb源码并编译安装gdb以及gdbserver(默认rhel Linux下不带gdbserver,一般用于嵌入式开发,否则会提示找到gdbserver);
gdb的安装可以baidu,唯一需要注意的是,刚从gnu下载的gdb源码目录中并没有gdb/gdbserver这个目录,configure/make/make install之后,就生成了gdbserver目录,然后执行make就可以了。
- 点击vs debug->linux console调出 linux控制台(否则,vs会卡死在那);
- 在/etc/ld.so.conf中包含/usr/local/mpc-1.0.1/lib(否则会提示cc1plus: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory)
第四,既然是为了在windows下开发,目标环境是linux,就一定得使用linux下专有特性验证下确实在linux下运行。
c++代码,以获取操作系统和配置信息为例:
#include <iostream> #include <stdio.h>
#include <stdlib.h>
#include <string.h> using namespace std; void getOsInfo()
{
FILE *fp = fopen("/proc/version", "r");
if (NULL == fp)
printf("failed to open version\n");
char szTest[] = { };
while (!feof(fp))
{
memset(szTest, , sizeof(szTest));
fgets(szTest, sizeof(szTest) - , fp); // leave out \n
printf("%s", szTest);
}
fclose(fp);
} void getCpuInfo()
{
FILE *fp = fopen("/proc/cpuinfo", "r");
if (NULL == fp)
printf("failed to open cpuinfo\n");
char szTest[] = { };
// read file line by line
while (!feof(fp))
{
memset(szTest, , sizeof(szTest));
fgets(szTest, sizeof(szTest) - , fp); // leave out \n
printf("%s", szTest);
}
fclose(fp);
} void getMemoryInfo()
{
FILE *fp = fopen("/proc/meminfo", "r");
if (NULL == fp)
printf("failed to open meminfo\n");
char szTest[] = { };
while (!feof(fp))
{
memset(szTest, , sizeof(szTest));
fgets(szTest, sizeof(szTest) - , fp);
printf("%s", szTest);
}
fclose(fp);
} int main()
{
printf("===os information===\n");
getOsInfo(); printf("===cpu infomation===\n");
getCpuInfo(); printf("===memory information===\n");
getMemoryInfo();
return ;
}
再看下用户根目录下的project。
直接在linux下运行看看是不是生成linux二进制的格式:
大功告成,可以干活了,必须宇宙第一IDE。。。
相关错误:
"undefined reference to" 多种可能出现的问题解决方法,除了本文中提及的示例外,常规开发中的引用三方库等都测试过了,不如引用gperftools的时候就出现这个异常,这是因为so安装在/usr/local/lib中,但其没有定义在LD_LIBRARY_PATH中的原因。https://blog.csdn.net/shaderdx/article/details/49929147
编译的时候找不到三方库头文件,在
中包含头文件目录即可,VC Directories/C++中的用于本地智能提示,https://developercommunity.visualstudio.com/content/problem/40127/additional-include-folders-problems-for-linux-proj.html
gdb提示Loaded 'shared libraries loaded at this time.'. Cannot find or open the symbol file.,如下:
程序运行成功,不影响,这应该是gdb自己的设置问题,和vs无关。https://stackoverflow.com/questions/46127228/visual-studio-2017-for-linux-c-cannot-find-or-open-the-symbol-file
引用非标准库中的so找不到,比如error while loading shared libraries: libmyso.so: cannot open shared object file: No such file or directory。这种情况下,需要确保包含的so在LD_LIBRARY_PATH或者系统库目录/usr/lib:/usr/local/lib下,同时加上-L编译选项,如下:
为什么一定要同时包含呢???仔细测试下了,如果去掉IDE中的-L选项,就会提示:
1> /usr/bin/ld: cannot find -lmyso
1> collect2: error: ld returned 1 exit status
可参考这篇的解释,但是感觉是其中一种原因:https://www.cnblogs.com/sylar5/p/6701318.html
===============================makefile工程=========================
在实际中,linux工程几乎95%+都是使用makefile工程,剩下的一部分使用cmake(mysql),所以我们需要能够直接在VS下开发和调试makefile工程。
1、首先创建makefile项目,如下:
2、创建一个Makefile文件,内容如下:
上图中的说明参见:https://stackoverflow.com/questions/48454486/debugging-makefile-project-of-linux-development-with-c
3、设置项目属性:
上图的说明原因参见:https://github.com/Microsoft/VSLinux/issues/99
这样就可以调试makefile工程了。
新补充:在有些情况下,我们没有主程序的代码,只有so的代码,此时要进行调试的话,在gdbserver模式,visual studio是step into so的代码的,无论是编译时链接的还是通过dlopen动态加载的so都一样,此时要在visual studio中进行debug,需要改为gdb模式(但是gdb模式不支持控制台交互模式,这要注意)。或者使用visualgdb,visualgdb和vs for linux在使用上还有些差别,后续专门开文讲解。
gdb模式(gdbserver没有这个问题)控制台输出中文乱码,但是程序在linux下执行输出则不是乱码,linux下的编码格式为UTF-8。
暂时不知道如何解决?
vs for linux box 远程debug mysql,参考:https://mysqlserverteam.com/compiling-mysql-in-visual-studio-on-a-remote-linux-box/
参考:
https://blogs.msdn.microsoft.com/vcblog/2017/04/11/linux-development-with-c-in-visual-studio/
https://blogs.msdn.microsoft.com/vcblog/2018/04/09/intellisense-for-remote-linux-headers/
https://www.cnblogs.com/coolulu/p/4124803.html
https://docs.microsoft.com/en-us/cpp/linux/configure-a-linux-project
visual studio 2015下使用gcc调试linux c++开发环境搭建完整详解的更多相关文章
- WebApi-路由机制 Visual Studio 2015中的常用调试技巧分享
WebApi-路由机制 一.WebApi路由机制是什么? 路由机制通俗点来说:其实就是WebApi框架将用户在浏览器中输入的Url地址和路由表中的路由进行匹配,并根据最终匹配的路由去寻找并匹配相应 ...
- s3c6410 Linux 驱动开发环境搭建
s3c6410 Linux 驱动开发环境搭建 -- 既然你是做Linux开发的,你还用虚拟机? 非常多人都在win下做开发,于是SD_writer.exe之类的烧写工具"大行其道" ...
- win10子系统linux.ubuntu开发环境搭建
移步新博客... win10子系统linux.ubuntu开发环境搭建
- .NET Core 在Visual Studio 2015 下的使用-MSDN
.NET Core RC2 现已推出,这是真正的"候选发布"而非 RC1 Beta 冒充的候选发布(如果是那样,请考虑发布后出现的所有更改).当前,围绕 .NET Core 的开发 ...
- Visual Studio 2015中的常用调试技巧分享
.NET 技术交流群:337901356 欢迎您的加入! 为什么要学习调试? 调试(Debug)是作为一个程序员必须要学会的东西,学会调试可以极大的提高开发效率,排错时间,很多人不喜欢调试,但我认为这 ...
- Visual Studio 2015下编译zmq项目下其他项目踩进的项目引用坑
PS.在之前的一篇文章中介绍了如何用Visual Studio 2015编译zmq,在编译同解决方案中除了libzmq之外的项目例如inproc_thr时会报错误,具如下: Severity Code ...
- visual studio 2015下python编程的中文字符串问题
visual studio 2015强大的编程功能,编写起python来也是非常方便的,但其对中文字符的支持不是很好,经常发生莫名其妙的错误,最常见的错误是不报错,也不执行代码. 代码简单如下: x= ...
- 重磅!微软发布 Visual Studio Online:Web 版 VS Code + 云开发环境
北京时间 2019 年 11 月 4 日,在 Microsoft Ignite 2019 大会上,微软正式发布了 Visual Studio Online (VS Online)公开预览版! 如今发布 ...
- Linux PC开发环境搭建建议
搭建Linux PC开发环境 很早之前整理的在Linux(ubuntu)系统下搭建 PC开发环境的工具的推荐和简单说明,尽管现在有些已经不再使用,但还是要备份一下,作为以后的参考: package: ...
随机推荐
- iOS库
https://medium.com/app-coder-io/33-ios-open-source-libraries-that-will-dominate-2017-4762cf3ce449#.i ...
- app刷新
https://segmentfault.com/a/1190000006733978 优化TCP socket参数,包括:是否关闭快速回收.初始RTO.初始拥塞窗口.socket缓存大小.Delay ...
- 搭建redsocks 测试环境
1. 先来谈谈pc的测试环境 socks5代理,因为要在centos下设置,没有yum到socks, 就安装ss5,wget http://jaist.dl.sourceforge.net/proje ...
- .yml文件格式
http://yaml.org/ YAML: YAML Ain't Markup Language What It Is: YAML is a human friendly data serializ ...
- iOS UI基础-7.0 UIScrollView
概述 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限.当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显示过多的 ...
- 数据加密之SymmetricAlgorithm加密
#region SymmetricAlgorithm加密 /// <summary> /// 按指定对称算法.键和向量加密字符串 /// </summary> public s ...
- 读书笔记_Effective C++_条款一:将C++视为一个语言联邦
C++起源于C,最初的名称为C with Classes,意为带类的C语言,然而,随着C++的不断发展和壮大,在很多功能上已经远远超越了C,甚至一些C++程序员反过来看C代码会觉得不习惯. C++可以 ...
- 函数式编程语言(functional language)
内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...
- HDU 2604 Queuing(递推+矩阵)
Queuing [题目链接]Queuing [题目类型]递推+矩阵 &题解: 这题想是早就想出来了,就坑在初始化那块,只把要用的初始化了没有把其他的赋值为0,调了3,4个小时 = = 本题是可 ...
- VMware vSphere
在进行操作vSphere产品之前,就曾经对它进行过一个简单了解:[运维]VMware vSphere简单了解,现在再回头看,发现了解的真的是太简单了.经过前一段时间学习之后,对它又有了新的感悟,再来谈 ...