使用VS2019远程开发Linux C/C++程序

2022-11-21 12:08:39

使用VS2019远程开发Linux C/C++程序

写下这篇文章,分享一下自己工作这一年多以来,使用VS2019远程开发、调试和部署Linux C/C++程序的一些使用经验和心得体会。
所谓工欲善其事必先利其器,开发一个项目之前,我们要选择好合适的开发工具以及开发环境。

Linux C/C++程序常见的开发方式

  • 在Linux系统上,使用 gcc、g++、gdb、make工具开发Linux C/C++程序;
  • 在VM虚拟机上,安装Ubuntu桌面版,使用vsCode开发Linux C/C++程序;
  • 在windows上使用vs2019远程跨平台开发Linux C/C++程序。

vs2019的跨平台开发功能介绍

vs2019支持跨平台开发功能,也就是说,你可以在你的Windows系统上使用vs2019通过SSH服务连接到另一台Linux主机上开发程序,这台Linux主机可以是嵌入式设备,可以是虚拟机VM中安装的Linux系统,也可以是你购买的云Linux服务器。所以要想使用vs2019进行跨平台开发,第一步要确保Windows系统可以ping通远程的Linux系统,并且Linux系统上安装了SSH服务。

在这之后我们就可以使用vs2019编辑代码,进行跨平台编译,并且可以利用vs2019强大的调试功能进行代码调试(这也是我使用vs2019作为开发工具的重点)。

使用步骤

下载、安装和设置vs2019Linux跨平台开发

vs2019安装

  • 在 Windows 搜索框中键入“visual studio installer”:在这里插入图片描述
  • 双击运行,选择“修改”,然后单击“工作负荷” 选项卡。滚到最下面,“其他工具集”,勾选“使用 C++ 的 Linux 开发”。在这里插入图片描述
  • 在最右侧,可选项中选择适用于Linux的CMake工具以及IntelliCode选项,前者是编译项目,后者是微软的智能代码提示功能。第三个选项应该是用于开发stm32单片机用的,我这里没有选择。在这里插入图片描述
  • 点击安装即可。

远程Linux环境安装

这里以我的百度云服务器举例,我使用的Linux发行版是Debian 6.3,你也可以使用Ubuntu、centos等发行版。在这里插入图片描述
vs2019中的 Linux 项目要求在远程 Linux 系统上安装以下依赖项:

  • gcc、g++ - 编译器。
  • gdb - vs2019会在 Linux 系统上自动启动 gdb,并使用 vs2019 调试器的前端在 Linux 上提供进行调试。
  • rsync 和 zip - 包含 rsync 和 zip 允许 vs2019 将头文件从 Linux 系统提取到 Windows 文件系统以供 IntelliSense 使用。(博主之前就是因为没有安装rsync,导致vs2019引用头文件时一直标红。)
  • make
  • openssh-server (仅适用于远程 Linux 系统)- vs2019 通过 SSH 连接到远程 Linux 系统。

如果你的Linux系统上没有安装以上工具,那么在 Linux 计算机上的 shell 提示符下,运行:

sudoapt-getinstall openssh-server g++ gdbmakersynczip

通过运行以下命令,确保 ssh 服务在 Linux 计算机上运行:

sudoservicessh start

连接到目标Linux系统

vs2019 会在远程计算机上生成 C++ Linux 项目。 可以是嵌入式Linux设备、虚拟机VM的Linux,以及云端的Linux系统。 为了生成项目,vs2019 会将源代码复制到远程 Linux 主机上。 然后,代码会根据 vs2019 的设置进行编译。

在远程系统上设置 SSH 服务器

这个上面已经说明过了。另外,若要让 SSH 服务器在系统启动时自动启动,使用 systemctl 启用它:

sudo systemctlenablessh

设置远程连接

  • 在 vs2019 中,依次选择菜单栏上的“工具”>“选项” ,打开“选项” 对话框。 然后,依次选择“跨平台”>“连接管理器” ,以打开“连接管理器”对话框。在这里插入图片描述

  • 在“连接管理器”对话框中,选择“添加” 按钮,以添加新连接。在这里插入图片描述

  • 接下来,会跳转到“连接到远程系统”窗口。在这里插入图片描述

  • 输入信息说明:
    主机名 :目标设备的名称或 IP 地址
    端口 :运行 SSH 服务的端口,通常为 22
    用户名 :要进行身份验证的用户
    身份验证类型 :同时支持密码和私钥
    密码 : 输入的用户名的密码

  • 点击连接按钮,尝试连接到远程计算机
    如果连接成功,vs2019 便会将 IntelliSense 配置为使用远程标头。

在vs2019中新建Linux项目

  • 在 vs2019 中选择“文件 > 新建项目”,或按 Ctrl + Shift + N。“创建新项目”对话框随即显示。
  • 在“搜索模板”文本框中输入“Linux”,列出 Linux 项目可用的模板 。
  • 选择要创建的项目类型(如“控制台应用程序”),然后选择“下一步” 。 输入“名称”和“位置”,然后选择“创建” 。在这里插入图片描述
  • 项目类型说明
    Raspberry Pi 项目 :面向 Raspberry Pi 设备的项目,附带让 LED 闪烁的示例代码
    控制台应用程序 : 面向任何 Linux 计算机的项目,附带将文本输出到控制台的示例代码
    空项目 : 面向任何 Linux 计算机的项目,不带任何示例代码
    生成文件项目 : 面向任何 Linux 计算机的项目,使用标准生成文件生成系统生成
    CMake 项目 : 面向任何 Linux 计算机的项目,使用 CMake 生成系统生成

在vs2019中配置Linux项目

常规设置

若要查看配置选项,请选择“项目”>“属性”菜单,或者在“解决方案资源管理器”中右键单击相应项目,选择最下面的属性。
在这里插入图片描述
在这里插入图片描述
默认情况下,生成可执行文件 (.out)。 若要生成静态或动态库,或使用现有生成文件(makefile文件),在“配置类型”中进行修改。

远程设置

  • 我们可以指定的远程Linux主机,配置“远程生成计算机”条目,选择我们之前创建的链接之一。
    在这里插入图片描述
  • “远程生成根目录”指定远程 Linux 计算机上生成项目的根位置。 默认为 ~/projects,我改成了家目录下的vs2019projects目录。
  • “远程部署目录”是在远程 Linux 计算机上生成此项目的位置。 该位置默认为 ( R e m o t e R o o t D i r ) / (RemoteRootDir)/(RemoteRootDir)/(ProjectName) ,也就是会放在上面设置的根目录下面。
    在这里插入图片描述
    给大家看一下我远程Linux生成的目录(这里你们还不能生成,需要配置介绍生成解决方案后,才会生成目录。)
    在这里插入图片描述

复制源

这里基本使用默认配置就可以,简单介绍一下。
在远程系统上进行生成时,Windows上的源文件将复制到 Linux 计算机并在该计算机上进行编译。 默认情况下,vs2019 项目中的所有源文件都将复制到上述设置中设置的位置。 也可以将其他源文件添加到此列表,或完全关闭复制源文件,这是生成文件项目的默认值。

  • "要复制的源"确定将哪些源文件复制到远程计算机。 默认情况下,@(SourcesToCopyRemotely) 默认为项目中的所有源代码文件。
  • 可以打开和关闭“复制源”,以启用和禁用将源文件复制到远程计算机操作。
  • 通过“要复制的其他源”,可添加将复制到远程系统的其他源文件。
    在这里插入图片描述
  • 注意"远程复制源方法",如果选择了rsync,那么远程Linux计算机上一定要安装rsync。

远程系统上头文件的 IntelliSense

在连接管理器中添加新连接时,vs2019 会自动为远程系统上的编译器检测包含目录。 随后 vs2019 压缩这些文件,并将其复制到本地 Windows 计算机上的目录中。 此后,每当在 Visual Studio 项目中使用该连接时,都会使用这些目录中的头文件来提供 IntelliSense。

  • 此功能的前提是 Linux 计算机中安装了 zip。

若要管理标头缓存,点击“工具”>“选项”,依次选择“跨平台”>“连接管理器”>“远程标头 IntelliSense 管理器”。 若要在更改 Linux 计算机后更新标头缓存,选择远程连接IP地址,然后选择“更新”。 选择“删除”,来删除标头但不会删除连接本身。 选择“浏览”,打开“文件资源管理器”中的本地目录 。 将此文件夹视为只读文件夹。
在这里插入图片描述

目标平台

目标平台是指可执行程序将在此之上运行的操作系统 。 可以生成多个平台的项目。 C++ 项目的可用目标平台取决于各种项目;包括但不限于 Win32、x64、ARM、Android 和 iOS。 Win32 意味着 32 位的 Windows,而 x64 意味着 64 位的 Windows 。选择项目属性->配置管理器,可以选择debug版或是release版,以及选择程序所运行的平台,这里我选择的是debug,x64。此处ARM是指ARM架构32位cpu;ARM64是指ARM架构64位cpu;x64是指Intel64位架构cpu;x86是指Intel32位架构cpu。
在这里插入图片描述

常规属性 Linux C++(如果初次配置,使用默认配置即可,有特定需求可以进行设置)

在这里插入图片描述

  • 输出目录 : 指定输出文件目录的相对路径。 它可包括环境变量。
  • 中间目录 :指定中间文件目录的相对路径。 它可包括环境变量。
  • 目标名称 :指定此项目生成的文件名称。
  • 目标扩展名 :指定此项目生成的文件名称(例如 .a .so .out)。
  • 清除时要删除的扩展名 :分号分隔的通配符规范,指定在清除或重新生成时要删除中间目录中的哪些文件。
  • 生成日志文件 :指定启用生成日志时要写入的生成日志文件。
  • 平台工具集 :指定用于生成当前配置的工具集。 如果未设置,则使用默认工具集。
  • 远程生成计算机 :用于远程生成、部署和调试的Linux计算机。
  • 远程根目录 :指定远程Linux计算机上目录的路径。
  • 配置类型 :指定此配置生成的输出类型,如:动态库 (.so)、静态库 (.a)、应用程序 (.out) 和makefile文件。
  • STL 的使用 :指定要用于此配置的 C++ 标准库,如:共享 GNU 标准 C++ 库或静态 GNU 标准 C++ 库 (-static)。

使用附加库

例如我们需要使用pthread库,那么就在"库依赖项"一栏输入lpthread。就相当于gcc设置"-l[库名称]"选项,用于指定链接时所需要的动态库或静态库。
在这里插入图片描述

在vs2019中部署、运行和调试Linux项目

配置完成前面的工作之后,我们就可以开始运行和调试项目。是不是还有点小激动呢。下面的操作会在远程Linux系统上编译、执行和调试代码。其实也可以理解为交叉编译。
与 Linux 项目交互并对其进行调试方法有若干种。

  • 使用 Visual Studio 传统功能(例如断点、监视窗口和悬停在变量上)进行调试。 使用这些方法,可以像平常调试其他项目类型那样进行调试。不要太方便噢,让你的项目进度开发原地起飞!
  • 从 Linux 控制台窗口中的目标计算机查看输出。 还可以使用控制台将输入发送到目标计算机。

调试Linux项目

  1. 在“调试”属性页中选择调试模式。
    GDB 用于调试在 Linux 上运行的应用程序。 GDB 可以在两种不同的模式下运行,可从项目“调试”属性页中的“调试模式”选项中进行选择:
    在这里插入图片描述
  • 在 gdbserver 模式下,GDB 在本地运行,连接到在远程系统上的 gdbserver。
  • 在 gdb 模式下,vs2019 调试程序在远程系统上驱动 GDB 。 建议选择gdb模式。
  1. 使用调试工作栏,选择远程目标。
    在这里插入图片描述
  2. 在代码的左滚动条槽中单击,设置断点。
    设置断点的代码行上出现一个红点。
    在这里插入图片描述
    1. 按 F5(或者“调试”>“开始调试”)开始调试。
      开始调试时,应用程序先在远程Linux系统上编译,再启动。 任何编译错误都将显示在“错误列表”窗口中。
      如果没有错误,则应用将启动并且调试程序将在断点处暂停。
      在这里插入图片描述
      现在,可通过按命令键(如 F10 或 F11),与处于当前状态的应用程序交互、查看变量以及逐行执行代码。
    2. 如果需要使用 Linux 控制台与应用进行交互,请选择“调试”>“Linux 控制台”。
      此控制台将显示来自远程Linux计算机的全部控制台输出并接收输入,并将其发送到远程Linux计算机。在这里插入图片描述
  • 配置其他调试选项
    在这里插入图片描述
    可以使用“其他调试程序命令”条目将特定调试程序选项传递到 GDB。 例如,你可能需要忽略 SIGILL(非法指令)信号。 可以使用 handle 命令实现此目的,方法是将以下命令添加到上图所示的“其他调试程序命令”条目:
handle SIGILL nostop noprint

总结

总的来说,以上的各项配置,在实际开发中都会碰到。大家可以一点点来,遇到了问题再来寻求解决方法。没必要一次性全部配置完成。很多配置也是在工作工程中,慢慢理解的。
在使用vs2019远程开发Linux项目的过程中,得益于vs强大的调试功能,项目的编译调试以及部署都会很方便,但是有一点不太好的,就是如果远程Linux主机的性能不高同时项目又比较大的话,生成项目的时间会比较长。所以博主也在考虑后面在vm虚拟机上使用vsCode利用交叉编译工具开发嵌入式Linux项目。

参考文章

  1. https://docs.microsoft.com/zh-cn/cpp/linux/download-install-and-setup-the-linux-development-workload?view=msvc-160
  2. https://docs.microsoft.com/zh-cn/cpp/linux/connect-to-your-remote-linux-computer?view=msvc-160
  3. https://docs.microsoft.com/zh-cn/cpp/linux/create-a-new-linux-project?view=msvc-160
  4. https://docs.microsoft.com/zh-cn/cpp/linux/configure-a-linux-project?view=msvc-160
  5. https://docs.microsoft.com/zh-cn/cpp/linux/deploy-run-and-debug-your-linux-project?view=msvc-160
  6. https://docs.microsoft.com/zh-cn/cpp/build/working-with-project-properties?view=msvc-160
  7. https://docs.microsoft.com/zh-cn/cpp/linux/prop-pages/general-linux?view=msvc-160
  8. https://www.cnblogs.com/dongc/p/6599461.html#top
  • 作者:zhangxiaolong010
  • 原文链接:https://blog.csdn.net/weixin_43859355/article/details/121098577
    更新时间:2022-11-21 12:08:39