教程:在 Visual Studio 中创建C++跨平台项目

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++编译器、gdbsshrsyncmakezip。 在基于 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
  1. 在 Visual Studio 主菜单上,选择 “文件 > 打开 > CMake”。 找到您下载的 bullet3 存储库根目录中的 CMakeLists.txt 文件。

    显示“文件 > 打开 > C Make”的 Visual Studio 菜单的屏幕截图。文件夹尚未打开。这只是此时打开的菜单。

    打开文件夹后,文件夹结构就会在 解决方案资源管理器中可见。

    文件夹视图模式下“解决方案资源管理器”窗口的屏幕截图。它显示项目(文件和文件夹)的内容,并突出显示了 CMakeLists.txt。

    此视图显示磁盘上的内容,而不是逻辑视图或筛选视图。 默认情况下,它不显示隐藏的文件。

  2. 选择“ 显示所有文件 ”按钮可查看文件夹中的所有文件。

    解决方案资源管理器窗口的屏幕截图,其中突出显示了“显示所有文件”按钮。此按钮位于解决方案资源管理器窗口和右侧。

切换到目标视图

打开使用 CMake 的文件夹时,Visual Studio 会自动生成 CMake 缓存。 此操作可能需要一些时间,具体取决于项目的大小。

  1. “输出”窗口中,选择“ 显示输出 ”,然后选择 “CMake ”以监视缓存生成过程的状态。 作完成后,它显示“完成目标信息提取”。

    “输出”窗口的屏幕截图。“显示输出来源:”下拉列表设置为 CMake。

    此操作完成后,IntelliSense 将被配置。 可以生成项目并调试应用程序。 Visual Studio 现在根据 CMakeLists 文件中指定的目标显示解决方案的逻辑视图。

  2. 使用解决方案资源管理器中的“解决方案和文件夹”按钮切换到 CMake 目标视图。

    解决方案资源管理器中“解决方案和文件夹”按钮的屏幕截图。它被选中,显示一个下拉列表,其中包含 c:\projects\bullet3 的选项和 CMake 目标视图的另一个选项,该选项已被选中。

    Bullet SDK 的界面如下:

    解决方案资源管理器 CMake 目标视图的屏幕截图。它包含名为 BULLET_PHYSICS Project 的条目,其下是App_BasicExample(可执行文件)、App_ExampleBrowser(可执行文件)等条目。

    目标视图提供了此源基础内容更直观的视图。 可以看到一些目标是库,而另一些目标是可执行文件。

  3. 在 CMake 目标视图中展开节点以查看其源代码文件,无论这些文件位于磁盘上的哪个位置。

添加显式的 Windows x64-Debug 配置

Visual Studio 为 Windows 创建默认 的 x64-Debug 配置。 Visual Studio 可借助配置了解将在 CMake 中使用的平台目标。 默认配置未在磁盘上表示。 显式添加配置时,Visual Studio 将创建一个名为 CMakeSettings.json的文件。 其中填充了所指定的所有配置的设置。

  1. 添加新配置。 在工具栏中打开 “配置 ”下拉列表,然后选择“ 管理配置”。

    工具栏中“配置”下拉列表的屏幕截图。管理配置...处于选中状态。

    此时会打开 CMake 设置编辑器 。 选择编辑器左侧的绿色加号以添加新配置。 此时会显示“ 将配置添加到 CMakeSettings ”对话框:

    “将配置添加到 CMakeSettings”对话框的屏幕截图。它具有 Linux-Debug、x86-Debug 等条目。已选择 x64-Debug。

    此对话框显示 Visual Studio 附带的所有配置,以及你创建的所有自定义配置。 如果想要继续使用 x64-Debug 配置,该配置应该是你添加的第一个配置。 选择 x64-Debug,然后选择 “选择” 按钮。 Visual Studio 使用 x64-Debug 的配置创建 CMakeSettings.json 文件,并将其保存到磁盘。 可以通过直接在 CMakeSettings.json中更改名称参数来对配置使用任何喜欢的名称。

在 Windows 上设置断点、生成和运行

在此步骤中,我们将调试一个演示 Bullet Physics 库的示例程序。

  1. 解决方案资源管理器中,选择 AppBasicExampleGui 并将其展开。

  2. 打开 BasicExample.cpp文件。

  3. 设置在单击正在运行的应用程序时触发的断点。 单击事件在 helper 类中的方法中进行处理。 要快速到达那里:

    1. 选择结构 BasicExample 派生自的 CommonRigidBodyBase。 此函数大约在第 30 行。

    2. 右键单击并选择 “转到定义”。 现在,你位于 CommonRigidBodyBase.h 头文件中。

    3. 在源上方的浏览器视图中,应看到自己位于 CommonRigidBodyBase。 转到右侧,可以选择要检查的成员。 打开下拉列表并选择 mouseButtonCallback 转到标头中该函数的定义。

      编辑器窗口中成员列表工具栏下拉列表的屏幕截图。它列出 getRayTo(在 x 中,int y)等函数。突出显示鼠标按钮回调方法。

  4. 在此函数的第一行上放置断点。 在 Visual Studio 调试器下运行时,在应用程序窗口中单击鼠标按钮时会触发此断点。

  5. 若要启动应用程序,请在工具栏中选择启动下拉列表。 它是一个带有绿色播放图标的图标,上面写着“选择启动项”。在下拉列表中,选择 AppBasicExampleGui.exe。 可执行文件名称现在显示在启动按钮上:

    Visual Studio 工具栏启动下拉列表的屏幕截图。选择 AppBasicExampleGui.exe,但其他选项可见,例如 App_ExampleBrowser.exe、App_HelloWorld.exe和其他选项。

  6. 选择启动按钮以生成应用程序和必要的依赖项,然后使用附加的 Visual Studio 调试器启动它。 片刻后,将显示正在运行的应用程序:

    正在运行的应用程序的屏幕截图。它是黄色平面上彩色块的集合。

  7. 将鼠标移动到应用程序窗口中,然后单击按钮以触发断点。 此断点会将 Visual Studio 带回到前台,并且编辑器显示执行暂停的行。 可以以交互方式检查应用程序变量、对象、线程和内存或步骤。 选择 “继续 ”以让应用程序恢复,然后正常退出。 或者,使用停止按钮在 Visual Studio 中停止执行。

添加 Linux 配置并连接到远程计算机

  1. 添加 Linux 配置。 右键单击 解决方案资源管理器 视图中的 CMakeSettings.json 文件,然后选择“ 添加配置”。 会看到与以前相同的“将配置添加到 CMakeSettings”对话框。 这次选择 Linux-Debug ,然后保存 CMakeSettings.json 文件(ctrl + s)。

  2. Visual Studio 2019 版本 16.6 或更高版本 向下滚动到 CMake 设置编辑器的底部,然后选择“ 显示高级设置”。 选择 Unix 生成文件 作为 CMake 生成器,然后保存 CMakeSettings.json 文件(ctrl + s)。

  3. 在配置下拉列表中选择 Linux-Debug

    启动配置下拉列表的屏幕截图。可见选项包括:x64-Debug、Linux-Debug 和管理配置。

    如果是第一次连接到 Linux 系统,将显示 “连接到远程系统 ”对话框。

    Visual Studio 连接到远程系统对话框的屏幕截图。

    该对话框包含主机名、端口、用户名、身份验证类型和密码的字段。 除端口设置为 22 外,所有字段均为空,身份验证类型设置为“密码”。

    如果已添加远程连接,可以通过导航到 “工具 > 选项 > 跨平台 > 连接管理器”打开此窗口。

  4. 提供 Linux 计算机的连接信息 ,然后选择 “连接”。 Visual Studio 会将该计算机添加为 CMakeSettings.json,作为“Linux-Debug”的默认连接。 它还会从远程计算机中下拉标头,以便获得特定于该远程连接的 IntelliSense。 接下来,Visual Studio 将文件发送到远程计算机,并在远程系统上生成 CMake 缓存。 这些步骤可能需要一些时间,具体取决于网络的速度和远程计算机的电源。 你知道,当消息“目标信息提取完成”出现在 CMake 输出窗口中时,它已完成。

在 Linux 上设置断点、生成和运行

因为它是桌面应用程序,因此需要向调试配置提供一些更多配置信息。

  1. 在 CMake 目标视图中,右键单击 AppBasicExampleGui,然后选择 “调试”和“启动设置” 以打开隐藏的 .vs 子文件夹中的 launch.vs.json 文件。 此文件是开发环境的本地文件。 如果希望签入该文件并将其保存到团队中,则可以将该文件移动到项目的根目录中。 在此文件中,已为 AppBasicExampleGui 添加了配置。 大多数情况下,这些默认设置都起作用,但在此处不起作用。 因为它是桌面应用程序,因此需要提供一些附加信息来启动程序,以便你可以在 Linux 计算机上看到它。

  2. 若要在 Linux 计算机上查找环境变量 DISPLAY 的值,请运行以下命令:

    echo $DISPLAY
    

    在 AppBasicExampleGui 的配置中,有一个参数数组“pipeArgs”。 它包含一行:“${debuggerCommand}”。 它是在远程计算机上启动 gdb 的命令。 在此命令运行之前,Visual Studio 必须将显示导出到此上下文中。 例如,如果显示的 :1值为,请按如下所示修改该行:

    "export DISPLAY=:1;${debuggerCommand}",
    
  3. 启动和调试应用程序。 在工具栏中打开 “选择启动项 ”下拉列表,然后选择 AppBasicExampleGui。 接下来,选择工具栏中的绿色播放图标,或按 F5。 应用程序及其依赖项构建在远程 Linux 计算机上,然后通过附加 Visual Studio 调试器启动。 在远程 Linux 计算机上,应会看到应用程序窗口出现。

  4. 将鼠标移动到应用程序窗口中,然后单击按钮。 命中断点。 程序执行暂停,Visual Studio 回到前台,你将看到该断点。 还应在 Visual Studio 中看到 Linux 控制台窗口。 该窗口提供来自远程 Linux 计算机的输出,并且还可以接受输入以用于 stdin。 与任何 Visual Studio 窗口一样,你可以将其停靠在你喜欢的位置。 在未来的会话中保留其位置。

    Visual Studio Linux 控制台窗口的屏幕截图。

    窗口中的输出指示使用 dlopen/dlsym 动态加载的 C11 函数是正常的,已创建 GL 3.0 上下文,并已获取和设置为当前的直接 GLX 渲染上下文。 该窗口包含多种关于GL_VENDOR、GL_VERSION、GL_SHADING_LANGUAGE_VERSION等的版本信息。

  5. 可以使用 Visual Studio 以交互方式检查应用程序变量、对象、线程、内存和单步执行代码。 但这次,你将在远程 Linux 计算机上执行所有作,而不是在本地 Windows 环境中执行此作。 可以选择 “继续 ”让应用程序正常恢复和退出,也可以选择停止按钮,就像本地执行一样。

  6. 查看“调用堆栈”窗口,并查看自 Visual Studio 在 Linux 上启动应用程序后对 x11OpenGLWindow 的调用。

    Visual Studio 调用堆栈窗口,显示 Linux 调用堆栈。

    callstack 显示 CommonRigidBodyBase::mouseMoveCallback 上的断点,以及其前面的调用,例如 OnMouseMove、X11OpenGLWindow::pumpMessage 等。

已了解的内容

在本教程中,你直接从 GitHub 克隆了一个代码库。 你在 Windows 上生成、运行和调试了它,而无需修改。 然后,你使用了相同的基本代码,并进行了细微的配置更改,用于在远程 Linux 计算机上生成、运行和调试。

后续步骤

详细了解如何在 Visual Studio 中配置和调试 CMake 项目: