Visual Studio C 和C++开发不再仅适用于 Windows。 本教程介绍如何在 Windows 和 Linux 上使用 Visual Studio 进行跨平台开发C++。 它基于 CMake,因此无需创建或生成 Visual Studio 项目。 打开包含 CMakeLists.txt 文件的文件夹时,Visual Studio 会自动配置 IntelliSense 和生成设置。 可以快速开始在 Windows 上本地编辑、生成和调试代码。 然后,切换配置以便在 Linux 上执行相同的操作,所有这些操作都是在 Visual Studio 中。
本教程中,您将学习如何:
- 从 GitHub 克隆一个开源 CMake 项目
- 在 Visual Studio 中打开项目
- 在 Windows 上生成和调试可执行目标
- 在 Linux 计算机上添加连接
- 在 Linux 上生成和调试同一目标
先决条件
设置 Visual Studio 进行跨平台 C++ 开发
- 首先,安装 Visual Studio,选择使用 C++ 的桌面开发和使用 C++ 的 Linux 开发工作负载。 此最小安装仅 3 GB。 根据下载速度,安装不应超过 10 分钟。
为跨平台C++开发设置 Linux 计算机
Visual Studio 不需要任何特定的 Linux 分发版。 OS 可以在物理计算机、VM 或云中运行。 还可以使用适用于 Linux 的 Windows 子系统(WSL)。 但是,在本教程中,需要图形环境。 此处不建议使用 WSL,因为它主要用于命令行作。
Visual Studio 在 Linux 计算机上需要这些工具:C++编译器、
gdb
、ssh
、rsync
和make
zip
。 在基于 Debian 的系统上,可以使用此命令安装这些依赖项:sudo apt install -y openssh-server build-essential gdb rsync make zip
Visual Studio 要求 Linux 计算机上的 CMake 版本为启用服务器模式的近期版本(至少 3.8)。 Microsoft生成可在任何 Linux 发行版上安装的 CMake 通用版本。 建议使用此版本来确保具有最新功能。 可以从 GitHub 上 Microsoft 的 CMake 存储库分支获取 CMake 二进制文件。 转到该页并下载与 Linux 计算机上的系统体系结构匹配的版本,然后将其标记为可执行文件:
wget <path to binary> chmod +x cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh
可以看到运行脚本时使用的选项
--help
。 建议使用-prefix
选项在 /usr 路径中指定安装,因为 /usr/bin 是 Visual Studio 查找 CMake 的默认位置。 以下示例显示了 Linux-x86_64 脚本。 如果使用其他目标平台,请根据需要进行更改。sudo ./cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh --skip-license --prefix=/usr
在 Windows 计算机上安装的适用于 Windows 的 Git。
GitHub 帐户。
从 GitHub 克隆开源 CMake 项目
本教程在 GitHub 上使用 Bullet Physics SDK。 它为许多应用程序提供碰撞检测和物理模拟。 SDK 包括编译和运行的示例可执行程序,而无需编写其他代码。 本教程不会修改任何源代码或生成脚本。 为了开始,请在安装了 Visual Studio 的计算机上从 GitHub 克隆 bullet3 存储库。
git clone https://github.com/bulletphysics/bullet3.git
在 Visual Studio 主菜单上,选择 “文件 > 打开 > CMake”。 找到您下载的 bullet3 存储库根目录中的
CMakeLists.txt
文件。打开文件夹后,文件夹结构就会在 解决方案资源管理器中可见。
此视图显示磁盘上的内容,而不是逻辑视图或筛选视图。 默认情况下,它不显示隐藏的文件。
选择“ 显示所有文件 ”按钮可查看文件夹中的所有文件。
切换到目标视图
打开使用 CMake 的文件夹时,Visual Studio 会自动生成 CMake 缓存。 此操作可能需要一些时间,具体取决于项目的大小。
在 “输出”窗口中,选择“ 显示输出 ”,然后选择 “CMake ”以监视缓存生成过程的状态。 作完成后,它显示“完成目标信息提取”。
此操作完成后,IntelliSense 将被配置。 可以生成项目并调试应用程序。 Visual Studio 现在根据 CMakeLists 文件中指定的目标显示解决方案的逻辑视图。
使用解决方案资源管理器中的“解决方案和文件夹”按钮切换到 CMake 目标视图。
Bullet SDK 的界面如下:
目标视图提供了此源基础内容更直观的视图。 可以看到一些目标是库,而另一些目标是可执行文件。
在 CMake 目标视图中展开节点以查看其源代码文件,无论这些文件位于磁盘上的哪个位置。
添加显式的 Windows x64-Debug 配置
Visual Studio 为 Windows 创建默认 的 x64-Debug 配置。 Visual Studio 可借助配置了解将在 CMake 中使用的平台目标。 默认配置未在磁盘上表示。 显式添加配置时,Visual Studio 将创建一个名为 CMakeSettings.json的文件。 其中填充了所指定的所有配置的设置。
添加新配置。 在工具栏中打开 “配置 ”下拉列表,然后选择“ 管理配置”。
此时会打开 CMake 设置编辑器 。 选择编辑器左侧的绿色加号以添加新配置。 此时会显示“ 将配置添加到 CMakeSettings ”对话框:
此对话框显示 Visual Studio 附带的所有配置,以及你创建的所有自定义配置。 如果想要继续使用 x64-Debug 配置,该配置应该是你添加的第一个配置。 选择 x64-Debug,然后选择 “选择” 按钮。 Visual Studio 使用 x64-Debug 的配置创建 CMakeSettings.json 文件,并将其保存到磁盘。 可以通过直接在 CMakeSettings.json中更改名称参数来对配置使用任何喜欢的名称。
在 Windows 上设置断点、生成和运行
在此步骤中,我们将调试一个演示 Bullet Physics 库的示例程序。
在 解决方案资源管理器中,选择 AppBasicExampleGui 并将其展开。
打开
BasicExample.cpp
文件。设置在单击正在运行的应用程序时触发的断点。 单击事件在 helper 类中的方法中进行处理。 要快速到达那里:
选择结构
BasicExample
派生自的CommonRigidBodyBase
。 此函数大约在第 30 行。右键单击并选择 “转到定义”。 现在,你位于 CommonRigidBodyBase.h 头文件中。
在源上方的浏览器视图中,应看到自己位于
CommonRigidBodyBase
。 转到右侧,可以选择要检查的成员。 打开下拉列表并选择mouseButtonCallback
转到标头中该函数的定义。
在此函数的第一行上放置断点。 在 Visual Studio 调试器下运行时,在应用程序窗口中单击鼠标按钮时会触发此断点。
若要启动应用程序,请在工具栏中选择启动下拉列表。 它是一个带有绿色播放图标的图标,上面写着“选择启动项”。在下拉列表中,选择 AppBasicExampleGui.exe。 可执行文件名称现在显示在启动按钮上:
选择启动按钮以生成应用程序和必要的依赖项,然后使用附加的 Visual Studio 调试器启动它。 片刻后,将显示正在运行的应用程序:
将鼠标移动到应用程序窗口中,然后单击按钮以触发断点。 此断点会将 Visual Studio 带回到前台,并且编辑器显示执行暂停的行。 可以以交互方式检查应用程序变量、对象、线程和内存或步骤。 选择 “继续 ”以让应用程序恢复,然后正常退出。 或者,使用停止按钮在 Visual Studio 中停止执行。
添加 Linux 配置并连接到远程计算机
添加 Linux 配置。 右键单击 解决方案资源管理器 视图中的 CMakeSettings.json 文件,然后选择“ 添加配置”。 会看到与以前相同的“将配置添加到 CMakeSettings”对话框。 这次选择 Linux-Debug ,然后保存 CMakeSettings.json 文件(ctrl + s)。
Visual Studio 2019 版本 16.6 或更高版本 向下滚动到 CMake 设置编辑器的底部,然后选择“ 显示高级设置”。 选择 Unix 生成文件 作为 CMake 生成器,然后保存 CMakeSettings.json 文件(ctrl + s)。
在配置下拉列表中选择 Linux-Debug 。
如果是第一次连接到 Linux 系统,将显示 “连接到远程系统 ”对话框。
该对话框包含主机名、端口、用户名、身份验证类型和密码的字段。 除端口设置为 22 外,所有字段均为空,身份验证类型设置为“密码”。
如果已添加远程连接,可以通过导航到 “工具 > 选项 > 跨平台 > 连接管理器”打开此窗口。
提供 Linux 计算机的连接信息 ,然后选择 “连接”。 Visual Studio 会将该计算机添加为 CMakeSettings.json,作为“Linux-Debug”的默认连接。 它还会从远程计算机中下拉标头,以便获得特定于该远程连接的 IntelliSense。 接下来,Visual Studio 将文件发送到远程计算机,并在远程系统上生成 CMake 缓存。 这些步骤可能需要一些时间,具体取决于网络的速度和远程计算机的电源。 你知道,当消息“目标信息提取完成”出现在 CMake 输出窗口中时,它已完成。
在 Linux 上设置断点、生成和运行
因为它是桌面应用程序,因此需要向调试配置提供一些更多配置信息。
在 CMake 目标视图中,右键单击 AppBasicExampleGui,然后选择 “调试”和“启动设置” 以打开隐藏的 .vs 子文件夹中的 launch.vs.json 文件。 此文件是开发环境的本地文件。 如果希望签入该文件并将其保存到团队中,则可以将该文件移动到项目的根目录中。 在此文件中,已为 AppBasicExampleGui 添加了配置。 大多数情况下,这些默认设置都起作用,但在此处不起作用。 因为它是桌面应用程序,因此需要提供一些附加信息来启动程序,以便你可以在 Linux 计算机上看到它。
若要在 Linux 计算机上查找环境变量
DISPLAY
的值,请运行以下命令:echo $DISPLAY
在 AppBasicExampleGui 的配置中,有一个参数数组“pipeArgs”。 它包含一行:“${debuggerCommand}”。 它是在远程计算机上启动
gdb
的命令。 在此命令运行之前,Visual Studio 必须将显示导出到此上下文中。 例如,如果显示的:1
值为,请按如下所示修改该行:"export DISPLAY=:1;${debuggerCommand}",
启动和调试应用程序。 在工具栏中打开 “选择启动项 ”下拉列表,然后选择 AppBasicExampleGui。 接下来,选择工具栏中的绿色播放图标,或按 F5。 应用程序及其依赖项构建在远程 Linux 计算机上,然后通过附加 Visual Studio 调试器启动。 在远程 Linux 计算机上,应会看到应用程序窗口出现。
将鼠标移动到应用程序窗口中,然后单击按钮。 命中断点。 程序执行暂停,Visual Studio 回到前台,你将看到该断点。 还应在 Visual Studio 中看到 Linux 控制台窗口。 该窗口提供来自远程 Linux 计算机的输出,并且还可以接受输入以用于
stdin
。 与任何 Visual Studio 窗口一样,你可以将其停靠在你喜欢的位置。 在未来的会话中保留其位置。窗口中的输出指示使用 dlopen/dlsym 动态加载的 C11 函数是正常的,已创建 GL 3.0 上下文,并已获取和设置为当前的直接 GLX 渲染上下文。 该窗口包含多种关于GL_VENDOR、GL_VERSION、GL_SHADING_LANGUAGE_VERSION等的版本信息。
可以使用 Visual Studio 以交互方式检查应用程序变量、对象、线程、内存和单步执行代码。 但这次,你将在远程 Linux 计算机上执行所有作,而不是在本地 Windows 环境中执行此作。 可以选择 “继续 ”让应用程序正常恢复和退出,也可以选择停止按钮,就像本地执行一样。
查看“调用堆栈”窗口,并查看自 Visual Studio 在 Linux 上启动应用程序后对
x11OpenGLWindow
的调用。callstack 显示 CommonRigidBodyBase::mouseMoveCallback 上的断点,以及其前面的调用,例如 OnMouseMove、X11OpenGLWindow::pumpMessage 等。
已了解的内容
在本教程中,你直接从 GitHub 克隆了一个代码库。 你在 Windows 上生成、运行和调试了它,而无需修改。 然后,你使用了相同的基本代码,并进行了细微的配置更改,用于在远程 Linux 计算机上生成、运行和调试。
后续步骤
详细了解如何在 Visual Studio 中配置和调试 CMake 项目: