Share via


Visual C++上的Linux开发

[原文发表地址]:Visual C++ for Linux Development

[原文发表时间]:2016/3/30

Visual C++上的Linux开发

今天我们做了一项新的扩展,在Visual Studio中实现目的为Linux的C++程序开发。使用这项扩展您可以为Linux服务器、桌面程序和设备编写C++代码。您可以从VS中管理这些机器的连接。VS可以自动拷贝并远程构建您的源文件,用调试器启动您的应用。我们的产品系统支持特定的体系结构,包括ARM。请阅读以下内容,以获得如何开始我们的新Linux工程。

现在我们仅支持在Linux目的机器上的远程构建。我们并不限于特定的Linux发行版本,但是我们确实对一些工具的存在有一些依赖。特别是我们需要openssh-sever,g++,gdb和gdbserver。使用您最喜欢的工具包管理器安装它们,例如基于Debian的系统:

sudo apt-get install openssh-server g++ gdb gdbserver

安装

下载VisualC++ for Linux Development扩展或者从Visual Studio扩展管理器中获得它。如今我们确实依赖于Android Tools for Visual Studio工具。如果您已经安装了VS,您可以通过添加/卸载程序添加它们,更改Visual Studio并在Visual C++ Mobile Development下添加它们。

从模板>Visual C++>交叉平台>Linux下新建一个新工程开始。

目前我们有三个模板可用:Blink(针对IoT设备例如Raspberry Pi),Console Application(相当于一个空应用程序),和Empty(您可以从一个干净的模板添加资源和设置)。

您的第一个VS Linux工程

让我们从创建一个Console Application开始。在您从模板中创建您的工程以后,在printf语句上设置一个断点然后按F5键或点击Remote GDB Debugger按钮。默认情况下,Console Application设置为debug/x64。如果您的远程目的机器是x86或ARM,您需要首先更改这些选项。在这个例子中我使用了一个x64 Ubuntu VM。

因为这是我们第一次把Linux机器作为目的机器,所以您需要在弹出的对话框中输入连接信息。这是由构建这个工程触发的。

我们同时支持密码和基于证书的认证/授权,包括使用密码短语证书。在连接成功后我们保存您的连接信息以便下一次连接。您可以在工具 >选项>交叉平台>Linux下管理您已保存的连接。当然密码或密码短语在保存时是加密的。我们计划在今后的更新中支持以无需保存连接信息的形式进行连接。

通过以上连接,您的源文件将会拷贝到远程的Linux机器上,而且我们会用工程属性中的选项来调用gcc构建源代码。在构建成功完成后,您的代码将会加载到远程机器上,并且停在您刚才设置的断点处。

Linux 工程属性

让我们来看一下工程属性来理解工程在远程Linux机器上的构建。

在远程设置中,我们可以看到远程的根目录默认地设置到~/project/,这就是我们要设置远程工程目录去匹配我们工程名字的位置。如果我们看一下Linux机器,我们就可以发现main.cpp和其他我们在~/projects/ConsoleApplication1目录下构建所生成的文件。

看一下这个工程的一般设置,您可以看到我们的输出和中间目录是如何被配置的。另外,您会发现这个工程被配置成一个应用程序—因此我们的可执行文件ConsoleApplication1.out在bin/x64/Debug/目录下。请注意,对于配置类型我们同样支持静态和动态库。

Linux IoT 工程

现在让我们看一下IoT设备,Raspberry Pi。您可以使用任何类型的Pi运行Raspbian。在我们的Blink例子中我们使用的是wiringPi—如果您没有安装这个,您可以通过apt或者source进行安装。通过工具 > 选项,然后搜索Linux来建立新的连接。现在您可以点击“添加”来连接到您的Raspberry Pi了。

到工程属性页中看一下Build Events下的Remote Post-Build Events。

您可以使用这个在构建之后,在远程Linux目的机器上去执行命令。这个模板来自于预配置,为LED输出GPIO引脚,这样我们就不必从根目录运行我们的可执行程序。

现在在您的Raspberry Pi上,连接一个LED到引脚17,如下所示。

打开main.cpp文件并且在第一个digitalWrite之后的延迟调用上打一个断点,然后按F5。您就会看到您的LED被点亮了,并且会在您打断点的位置暂停。逐步调试您的代码,当它通过下一个digitalWrite调用时,您将会看到您的LED被关掉了。

访问我们的IoT开发页面了解我们目前在这方面所提供的所有的功能。

桌面应用程序

我们已经覆盖了无设备的和有设备的Linux应用程序,那么桌面应用程序呢?好啦,我们这里有一些特别的:我们将要在Linux桌面上启动一个OpenGL应用程序。首先确保您的Linux桌面对于OpenGL开发已经进行了配置。我们使用这些apt包:libgles1-mesa, libgles1-mesa-dev, freeglut3, freeglut3-dev。

现在我们来创建一个空的Linux工程,并从Julien Guertault’s OpenGL tutorial获取Spinning Cube的源代码。把它展开并添加main.c到您的工程中。为了激活智能感应您需要加入OpenGL的头文件到VC++目录中,您可以从OpenGL Registry获取。现在到您的工程属性页,添加输出DISPLAY=:0.0到Pre-Launch命令中。

现在,在Linker的Input中添加库依赖:m;GL;GLU;glut.

同时,保证您的远程设置是对正确的机器。

现在按F5.

在几个有趣的地方,大约80行也就是立方体旋转起作用的地方(试图改变alpha值)或者在KeyboardFunc也就是您可以通过按键监测到值的地方,都可以打断点。

去写一些本地Linux代码吧

我们希望对于此项功能的开辟带来的潜在价值,您和我们一样激动不已。

安装VisualC++ for Linux Development扩展,尝试一下,并让我们知道对您来说什么能够工作,什么不能或者遇到了什么问题。如果您致力于IoT,请记住查看我们的IoT开发页面关注目前发生了什么。您可以通过这篇博客,通过扩展页,通过VS Feedback渠道,或者在Twitter上找到我们团队@visualc 或者我, @robotdad,和我们取得联系。

– Marc Goodner