利用vs2019编译器远程调试linux程序(走心版)

前段时间,参与了公司一个项目,需要开发linux服务程序,因为之前没接触过,对shell、GDB、makefile不熟悉,项目要的又紧,所以决定使用更为熟悉的vs编译器来远程调试linux程序,等有时间了再把makefile和GDB调试等熟悉起来,下面把个人经验讲一下,希望能帮到后面有这方面需要的人。

因为之前在学习过程中浏览过其他很多有用的博文,所以有些环节的内容直接用其他博文代替,本文着重讲解vs属性和gcc编译项之间的关联关系,因为我发现这部分内容其实很少有详细讲解到的。


首先把我的环境介绍一下:

1. Microsoft Visual Studio Community 2019 (社区版的,毕竟免费么,当然也是有些BUG的,此处不多说,安装选项里把linux相关的控制台、共享库等套件装上),vs2015、2017、2019都有远程调试linux的功能。

2. Ubuntu18 (Ubuntu 7.4.0-1ubuntu1~18.04.1);

3. VMware® Workstation 14 Player(也是个免费版本,不过建议安装workstation,功能更完善);


其中Ubuntu系统上必须要装的有 有以下几项:

1. openssh ,用于vs进行远程连接,安装命令: 

2. gcc、g++、gdb 用于编译调试你的c、c++代码,安装命令:

3. 网络IP,建议写成静态IP,防止重启linux系统后IP会变,那样vs的远程连接器也需要重新删除再连接,很麻烦,至于怎样修改ubuntu的IP本文不再赘述,网上方法很全,只要能保证主机和虚拟机之间相互能ping通。


至此,linux环境都已经装完了,下面在vs上增加远程连接器,方法在官网有详细步骤,https://docs.microsoft.com/zh-cn/cpp/linux/connect-to-your-remote-linux-computer?view=vs-2019

具体步骤本文不再赘述,只提一点建议:

1. 建议用root用户登录,因为工程里如果需要链接.so共享库,而这些共享库放在了/opt 或者 /usr等系统目录的话是需要管理员权限才能访问的,而这时如果你用普通用户登录了则会出现代码的链接错误(亲身经历的坑),ubuntu系统默认是不允许以root用户登录的,需要略作修改(修改方法:https://blog.csdn.net/f_IT_boy/article/details/89072168


远程连接建立好以后vs会把linux上的sdk开发环境拷贝一份到vs的缓存目录用于咱们在win系统上开发,这时我们就可以愉快的进行编码工作了,先建立一个Linux控制台程序,具体步骤参照: https://blog.csdn.net/ZYZMZM_/article/details/89044885 

这时,我们看下一解决方案资源管理器,除了main.cpp,还有一个外部依赖项,里面有很多乱七八糟的代码文件,其实这就是vs从linux系统拷贝来的sdk开发环境,如果双击其中一项,然后转到其目录,会发现这不就是linux上的环境目录么..

这时到linux系统里打开相应的目录也能找到相应的文件

这样,就能大体明白vs到底是怎么工作的了。


我们平时实际的工作中,肯定不会是简单的写几句代码就完事的,会有各种的第三方的动态库啊静态库啊头文件啊等等的,熟悉linux编程的都知道,我如果调用第三方库只需要在makefile的编译规则里用 -l来链接即可,如果要包含头文件目录只需要 -I(大写i)来包含即可, 那换到vs上该咋配置呢,下面就针对第三方库、头文件以及一些基本配置进行详细讲解。

1. 先看看vs属性页的基本配置有啥:

属性-常规:

这里定义了一些基本的环境信息,从字面上其实就能理解,主要关注的有:远程生成根目录(~/projects 也就是$RemoteRootDir)、远程生成项目目录、输出目录(最终的可执行程序目录默认是bin)、中间目录(.o文件的目录默认是obj)、目标文件名等(其实都需要理解一下)

属性-调试

这里面只需要关注程序参数即可,程序参数也就是命令行参数,如果需要就填上,主要用于调试过程,用空格分隔;

 

属性-复制源

这个选项是决定vs把哪些文件复制到linux系统上的工程目录里,只要加到解决方案资源管理器里的文件都会默认复制过去,如果有其他没在资源管理器中的文件可以加到第三项中,vs也会复制过去,更详细的解释见官方链接:https://docs.microsoft.com/zh-cn/cpp/linux/configure-a-linux-project?view=vs-2019

以上就是vs的基础配置了。


再来看看怎样包含头文件路径、库路径以及链接依赖库

这时候我们先编译一下程序,看看当前的编译规则是什么,vs build一下...

从输出内容里翻一翻会找到vs帮咱们组织生成的编译规则。那这时候如果我需要调用一个叫 util.so的共享库怎么办呢?首先来新建一个叫util.so的共享库,里面有个获取两个int值之和的函数 int get_sum(const int& a, const int& b);,新建空项目

属性里将配置类型修改为动态库

添加一个cpp文件一个头文件,并把get_sum方法实现,注意需要打开选项位置无关代码也就是 -fPIC,这样可以使用相对路径再编译阶段链接动态库

这时候编译整个解决方案就把两个工程都编译完成并生成相应的linuxTest.out和libutil.so了

现在我们在linuxTest工程里使用get_sum接口

先把util.h部署到ubuntu系统的/opt/test/public/include目录中,再把libutil.so部署到/opt/test/public/lib里

然后在linuxTest工程属性里把包含路径和库路径设置一下,然后再把libutil.so链接一下,注意,这里设置的都是Linux系统里相应的绝对路径,一定是绝对路径

注意,这里链接的名称不需要带lib前缀和.so后缀,编译器会自动加的。

配置完毕后,先编一下工程,成功!

至此,程序调用动态库已经编译通过,下面来部署一下运行环境,程序运行时加载的库默认会从LD_LIBRARY_PATH全局变量指定的目录里寻找,如果想要指定自己的目录则需要在/etc/profile里增加  

export LD_LIBRARY_PATH=/opt/test/public/lib:$LD_LIBRARY_PATH
保存之后要 source命令使修改生效  source /etc/profile
这样之后就能在自定义的库目录找到libUtil.so库了.

 

 运行一下,可以正常调用动态库接口,完毕!

以上就是vs2019调试linux程序的详细步骤了,最重要的还是配置环境和单步调试。

 

 

 

  • 16
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: VS2019是Microsoft Visual Studio 2019的简称,是一款由微软开发的集成开发环境,主要用于Windows平台的软件开发。而Linux是一种自由和开放源代码的操作系统。 在VS2019中,兼容Linux平台的功能是通过使用远程开发进行实现的。通过配置远程连接,可以在Windows上使用VS2019开发、编译调试Linux的应用程序。 关于unistd.h,在Linux系统中是一个头文件,包含了许多UNIX标准的系统调用函数的声明及其他与操作系统交互的函数和宏定义。这个头文件中定义了一些常用的符号常量(如STDIN_FILENO、STDOUT_FILENO)和函数原型(如read、write、open、close等),供程序员在编写使用系统调用的代码时使用。 在VS2019上进行Linux开发时,可以通过配置远程连接来使用unistd.h中定义的函数。通过配置远程主机,将Linux系统的头文件和库文件添加至VS2019中,就可以在Windows上通过VS2019来编写Linux应用程序。当需要使用unistd.h中的函数时,只需在代码中包含unistd.h头文件即可。 此外,VS2019还提供了一些工具和调试器,可以在代码开发过程中方便地进行调试和测试。可以设置断点,单步调试,在VS2019上实时查看程序的运行状态和变量值,帮助开发者更高效地进行开发和调试。 总之,通过VS2019远程开发功能,我们可以在Windows平台上使用与Linux兼容的功能,包括在代码中使用unistd.h中定义的系统调用函数,通过配置远程连接和调试工具,实现对Linux应用程序的开发和调试。 ### 回答2: VS2019是一款由Microsoft开发的集成开发环境(IDE),而Linux unistd.h是一个在Linux操作系统上使用的头文件。它们之间存在一些区别和联系。 首先,VS2019是主要用于Windows操作系统上的开发工具,提供了一套完整的开发环境和调试工具,并支持多种编程语言,如C ++、C#和VB.NET等。它提供了丰富的功能和图形界面,使开发者能够更方便地开发和调试应用程序。 而Linux unistd.h是Linux操作系统下的一个系统头文件,包含了系统调用的声明和定义。它定义了一些常用的系统调用的原型,例如read,write,open和close等。这些系统调用提供了与Linux内核进行交互的接口,使得开发者可以使用这些函数来操作文件、进程、网络和其他系统资源。 在使用VS2019进行Linux开发时,可能需要使用到Linux unistd.h头文件中定义的系统调用。这就要求开发者将Linux unistd.h的相关文件复制到Windows系统中,并配置好相关的编译器和链接器选项,以便在Windows环境下正确编译和链接Linux代码。 总结起来,VS2019Linux unistd.h是两个不同的工具和文件,分别用于在Windows环境下开发和在Linux环境下进行系统编程。在使用VS2019开发Linux程序时,可能需要使用到Linux unistd.h中定义的系统调用。开发者需要根据具体的需求和环境进行配置和调整,以便顺利开发和调试应用程序。 ### 回答3: vs2019是微软公司推出的一款集成开发环境,用于开发和调试多种应用程序。而Linux是一个自由、开源的操作系统,广泛应用于各种服务器和嵌入式设备。在Linux系统中,unistd.h是一个C语言标准库头文件,它提供了与系统调用相关的函数、宏和符号常量。 在vs2019中,可以通过添加相应的插件或扩展来实现对Linux环境的开发和调试。例如,可以使用“Visual Studio Tools for Linux”插件,它可以帮助开发人员在Windows系统上创建、开发和调试Linux应用程序。通过该插件,开发者可以使用vs2019的开发工具和功能来编写Linux应用程序,并在开发过程中进行调试。 在Linux环境下,unistd.h头文件对于系统编程非常重要。它定义了一系列系统调用函数的原型和常量。通过包含unistd.h头文件,开发者可以使用该头文件中定义的函数来进行进程控制、文件操作等系统级别的操作。例如,通过调用fork函数可以创建一个子进程,通过调用execve函数可以在进程中执行一个新的程序,通过调用open函数可以打开一个文件。 总之,vs2019Linux unistd.h是两个不同的东西。vs2019是一款用于开发Windows应用程序的集成开发环境,可以通过扩展或插件的方式实现对Linux环境的开发和调试。而unistd.h则是Linux系统中的一个头文件,提供了与系统调用相关的函数和常量的定义。在Linux系统编程中,unistd.h头文件是非常重要和常用的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值