跨平台代码共享和类型可视化的Linux C++改进

在Visual Studio 2017中,我们介绍了C++开发的Linux开发环境。 . 本教程将介绍我们在15.2版本中使用的经典spinningcube演示所做的一些改进 Julien Guertault的OpenGL教程 . 我们已经展示了 如何在Linux工作负载中使用OpenGL演示 以前。我们在这里展示的是如何使用visualstudio中的共享项将其作为Windows和Linux的单一源代码库。从这里我们将展示我们对于Linux C++的调试器类型可视化的一些改进,既用于NATVIS,也用于Python漂亮的打印。

null

C++跨平台共享代码共享

在VisualStudio 2015更新1中引入共享项目项目,以在针对特定平台的项目之间共享跨平台的C和C++代码。我们是通过 展示如何在Android、iOS和universalwindows平台上将共享项用于公共代码 . 我们现在还支持用Linux C/C++项目共享项目。

要尝试这个,您需要在安装Visual Studio 2017 15.2的情况下安装桌面C++和Linux开发,并安装C++工作负载。对于Linux部分,您需要一台安装了以下库的Linux机器。

sudo apt-get install libgles1-mesa libgles1-mesa-dev freeglut3 freeglut3-dev

你会想要的 将包含文件本地复制到Windows框中以启用IntelliSense 以及(添加这些库之后)。

要开始创建一个新的解决方案并在VisualC++ ++中选择共享项目项目,命名解决方案和项目CoprPosiCube。 获取旋转立方体的源代码 Julien Guertault的OpenGL教程 . 提取它并将main.c作为main.cpp添加到项目中。 现在,向您的解决方案中添加一个新项目,并选择VisualC++ + >空项目,并将其命名为WiDOWSCODE。现在右键单击引用并选择添加引用。在对话框中选择“共享项目”,然后选择“CrossPlatCube”。我们不打算向这个项目添加任何源代码,我们只是用它在shareditems项目中构建源代码。这样做 从martinpayne的站点获取预构建的OpenGL库 . 在计算机上提取这些文件,并在WindowsCube项目的项目属性中添加对VC++目录下的include和library目录的引用,以启用IntelliSense。您还需要在“常规”->“附加包含目录”下的“项目属性”中提供包含目录位置,并在“链接器”->“附加依赖项”下提供freeglut.lib的位置。现在,您应该能够构建和运行WindowsCube项目,并看到旋转的多维数据集。

现在,从Addio>新项目-VisualC++ +跨平台-Linux中添加一个新的空项目(Linux),并命名为LINUXCube。添加对CrossPlatCube项目的引用,就像对空的Windows项目所做的那样。在从CrossPlatCube项目中打开main.cpp(如果当前未打开)之前。注意在“文件名”选项卡下有一个上下文菜单,如果您将其下拉并选择WindowsCube项目,您将看到许多项都有紫色的波形,因为我们还没有为Linux项目添加include位置。紫色表示这些不是当前平台项目上下文的语法错误,而是使用共享项代码的另一个上下文中的错误。如果将上下文切换到LinuxCube项目,则波形将变为红色,表示它们是此上下文中的错误。

linuxsharing

现在打开项目属性,确保在“常规”下选择了正确的远程计算机,并在“VC++目录”->“包含目录”下添加本地文件夹和Linux包含文件。在调试属性页上,将export DISPLAY=:0.0添加到预启动命令。在链接器输入属性页下添加库依赖项:m;德国劳埃德船级社;谷氨酸;供过于求。现在右键单击Linux项目并将其设置为启动项目。现在,您应该能够使用构建Windows应用程序所用的相同代码在Linux机器上构建和运行它。

在上面的示例中,您已经看到了一些基本的IntelliSense、build和launch/debug功能,这些功能使用跨平台的共享项。共享项还为您提供特定于平台的语义着色、快速信息、参数帮助和特定于所选项目平台的成员列表结果。尽管如此,浏览和重构支持的功能,如Go-to/Peek-definition/declaration、Find-all-References、Call-Hierarchy和Class-View,也都可以用于任何您的项目目标平台。您将能够轻松地深入浏览特定于平台的头文件并返回到共享源文件。  你可以 在这篇共享文章中阅读更多关于这些功能的信息 .

调试器类型可视化改进

VisualStudio 15.2中改进的另一个领域是Linux C/C++的调试器类型可视化。这是使用Visual Studio NATVIS格式完成的,它提供了C/C++类型的可视化,并支持GDB中的Python漂亮打印。我们先谈谈民族。为了获得一些有趣的信息,让我们在立方体示例中添加libstdc++类型的一些用法。

将这些includes和array添加到CrossPlatCube项目的main.cpp中。

#include <vector>
#include <array>

std::vector<std::array<GLfloat, 6>> vertices = {
    { 0, 0, 0, -1, -1, -1},
    { 0, 0, 1, -1, -1, 1},
    { 0, 1, 1, -1,  1,  1 },
    { 0, 1, 0, -1,  1, -1 },
    { 1, 0, 0, 1, -1, -1 },
    { 1, 0, 1, 1, -1,  1 },
    { 1, 1, 1, 1,  1,  1 },
    { 1, 1, 0, 1,  1, -1 },
    { 0, 0, 0, -1, -1, -1 },
    { 0, 0, 1, -1, -1,  1 },
    { 1, 0, 1, 1, -1,  1 },
    { 1, 0, 0, 1, -1, -1 },
    { 0, 1, 0, -1,  1, -1 },
    { 0, 1, 1, -1,  1,  1 },
    { 1, 1, 1, 1,  1,  1 },
    { 1, 1, 0, 1,  1, -1 },
    { 0, 0, 0, -1, -1, -1 },
    { 0, 1, 0, -1,  1, -1 },
    { 1, 1, 0, 1,  1, -1 },
    { 1, 0, 0, 1, -1, -1 },
    { 0, 0, 1, -1, -1,  1 },
    { 0, 1, 1, -1,  1,  1 },
    { 1, 1, 1, 1,  1,  1 },
    { 1, 0, 1, 1, -1,  1 },
};

现在在这个注释所在的第45行删除对glCoror3f和glVertex3f的调用,并用数组上的for循环替换它们。

    /* Every four calls to glVertex, a quad is drawn */
    for (auto vertex : vertices)
    {
        glColor3f(vertex[0], vertex[1], vertex[2]);
        glVertex3f(vertex[3], vertex[4], vertex[5]);
    }

在for循环中设置断点并在Linux上运行应用程序。如果您使用的是Visual Studio 2017 15.1或更早版本,如果您要扩展for的范围,则会显示如下内容。

typebefore

在你得到你的数据之前那是相当深的。在Visual Studio 2017 15.2中,现在看起来是这样的。

typesnatvis

更容易获得您所关心的数据和实际类型信息。

我们为libstdc++提供了一个natvis可视化工具,它将在visualstudio2017中使用Linux项目的默认gdbserver和gdb模式。 本文描述了如何在这里使用natvis构建自己的可视化工具 ,创建后,只需将文件添加到项目根目录中,它就会被拾取并使用。如果需要,还可以使用原始视图而不是可视化视图。

我们还添加了对使用gdb模式的Python漂亮打印机的支持。你可以 从GNU站点了解更多关于Python漂亮打印的信息 ,但基本上这是在GDB中启用类型可视化的方式。它是在gdb7.0中引入的,从libstdc++的4.5版开始,打印机就随GCC一起提供了。如果您使用的是旧版本,您可能需要采取其他步骤来启用它们。Linux上的其他库可能提供打印机,也可能不提供打印机,但与natvis类似,您可以自己编写。让我们看一下与上面相同的示例。

typespythonprinter

在这里,您可以看到原始视图是什么,现在使用从Linux上的内置Python漂亮打印机返回的内容,它被清晰地可视化了。这里我已经扩展到数组中与上述示例相同的元素。在每个扩展级别上,您都可以看到显示natvis可视化的可视化视图,此处未展开。

默认情况下,Python pretty printing处于启用状态。如果遇到任何性能问题(大型数组等),可以在“项目属性”->“调试”->“启用Python打印”下停用它。

总结

我们希望这些改进能使我们的Linux C/C++支持对你更有帮助。你可以 了解更多关于我们的Linux C/C++支持 . 一如既往,我们很高兴收到你的来信 ,什么不起作用,还有什么起作用,以及你是如何使用它的。我们继续投资,以改善我们的Linux C/C++故事,并迫不及待地向大家展示我们正在做的事情。

-马克·古德纳, @机器人爸爸

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享