首页 > 科技 > 使用Visual Studio在Linux Docker容器中编译C++程序

使用Visual Studio在Linux Docker容器中编译C++程序

楔子

Docker容器,提供了一个集编译,测试和部署的统一开发环境。通过将虚拟化的操作系统,文件系统,环境变量,库以及其他依赖库通通封装到一个Image中,实现了在开发者或者机器之间的简单共享。这个特性对于C++跨平台开发者来说十分有用,因为你可以在一种开发环境中开发出是面向不同目标平台的程序。

今天的主题

今天我们来讲讲,通过使用Visual Studio对本机CMake的支持,实现在一个Linux Docker中编译一个简单的Linux小程序。
这篇文章将关注在如何创建你的第一个Docker容器和如何在Visual Studio中完成编译。如果你对Docker作为一个工具来配置一个可重建的开发环境感兴趣,可以去看看我的另外一篇文章”using multi-stage containers for C++ development”。

配置你的第一个Linux docker容器

首先,我们需要在Windows上来配置一个Linux docker容器。你需要先下载”Docker Desktop Client for Windows”,如果还没有建立docker账号,则需要建立一个。具体可以参考”Install Docker Desktop on Windows”。

接下来,我们下载一个Ubuntu OS,然后在Windows的命令行里执行如下的命令:

以上命令将会从Docker中下载最新版本的Ubuntu映像,从下图中,你可以看到当前所有的docker映像列表:

接下来,我们将使用一个Dockerfile来创建一个自定义的映像,此映像将基于已经下载完成的Ubuntu系统映像。
Dockerfile是一个包含一组用于组装系统的指令的配置文件。通过Dockerfile,我们可以自动化地在任何其他机器上重建相同的编译环境。下图中的Dockerfile可以用来在Visual Studio中安装必备组件并配置SSH。
CMake当然也是一个需要的依赖项,但是我们将在后面的步骤中直接部署一个静态链接的版本。

然后我们可以基于这个Dockerfile来编译一个自定义的系统映像,命令如下:

接下来,我们可以执行我们的容器:


在上面的命令中,我们使用了-p选项,表示向外界暴露我们的内部的端口。如果此命令执行成功,则将可以自动挂接到正在运行的容器中。你通过执行”exit”指令来随时停止docker容器。也可以使用”docker ps -a”, “docker start” 和”docker attach” 来重新挂接一个docker容器。

最后,我们可以使用SSH来直接连接到docker容器中。请注意了,你如果愿意,可以在Dockerfile中启用root账号,但要考虑到系统安全。


以上命令中的-m和-d选项用来创建一个新用户并指定其home路径,-s用来设置新用户的默认Shell。
至此,你将可以从Visual Studio中连接这个容器。

从Visual Studio中连接Docker容器

首先,请确保你安装了Visual Studio 2019和”Linux development with C++ workload”。
打开VS2019,创建一个CMake工程。CMake是一个跨平台工具,用来配置一个应用程序运行在Windows或者Linux之上。
当IDE完成新建工程的加载后,你可以添加一个SSH连接,用来连接Docker容器。
具体做法为:导航到Connection Manager(Tools > Options > Cross Platform > Connection Manager),然后选择”Add”即可添加一个远程连接。如下图所示:


这里的host name应该为localhost,端口则配置为SSH连接的端口(在这个例子中,我们使用5000这个端口),然后输入正确的账号和密码即可。

在Visual Studio中配置编译环境

目前我们新建的CMake工程还是和其他的普通CMake工程差不多。为了能在我们的Linux容器中配置和编译控制台程序,我们需要在配置下来框中做一些配置。

你可以在CMake Settings编辑器张工点击绿色的加号,然后添加一个”Linux-Debug”的配置。
请确保远程机器的名字和我们之前创建的Docker容器的名字一致。

保存CMake Settings然后选择新添加的Linux配置即可。如果你在Docker容器中还没有安装CMake,则VS将会提示你是否安装一个静态编译的版本。

至此,你可以在你的Linux docker容器中直接编译程序了。其他的编译配置,例如自定义工具链,CMake变量以及环境变量等,可以在CMake Settings编辑器中配置。底层的CMakeSettings.json文件可以保存起来,用来在各个机器或者开发人员中共享。

接下来…

这篇文章主要描述了如何通过Visual Studio来在一个Linux docker容器中编译C++程序。接下来,我们还将出一篇新的文章,讲解如何从容器中拷贝文件回Windows上,以及如何在第二台远程机器上使用gdbserver来进行调试。

总结

作为一个Docker外行,我是完全不知道我(具体)在说些什么。(外行看热闹)
所以,请熟悉Docker的朋友,告诉我这玩意(到底)意味着什么。(内行看门道)

不过,先让我猜猜:我们点击Visual Studio的Build,然后可以在一台远程Docker上编译在本机IDE上写的HelloWorld? (手动狗头保命)

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/264140.html