使用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的命令列裡執行如下的命令:

使用Visual Studio在Linux Docker容器中編譯C++程式

以上命令將會從Docker中下載最新版本的Ubuntu映像,從下圖中,你可以看到當前所有的docker映像列表:

使用Visual Studio在Linux Docker容器中編譯C++程式

接下來,我們將使用一個Dockerfile來建立一個自定義的映像,此映像將基於已經下載完成的Ubuntu系統映像。

Dockerfile是一個包含一組用於組裝系統的指令的配置檔案。透過Dockerfile,我們可以自動化地在任何其他機器上重建相同的編譯環境。下圖中的Dockerfile可以用來在Visual Studio中安裝必備元件並配置SSH。

CMake當然也是一個需要的依賴項,但是我們將在後面的步驟中直接部署一個靜態連結的版本。

使用Visual Studio在Linux Docker容器中編譯C++程式

然後我們可以基於這個Dockerfile來編譯一個自定義的系統映像,命令如下:

使用Visual Studio在Linux Docker容器中編譯C++程式

接下來,我們可以執行我們的容器:

使用Visual Studio在Linux Docker容器中編譯C++程式

在上面的命令中,我們使用了-p選項,表示向外界暴露我們的內部的埠。如果此命令執行成功,則將可以自動掛接到正在執行的容器中。你透過執行”exit”指令來隨時停止docker容器。也可以使用”docker ps -a”, “docker start” 和”docker attach” 來重新掛接一個docker容器。

最後,我們可以使用SSH來直接連線到docker容器中。請注意了,你如果願意,可以在Dockerfile中啟用root賬號,但要考慮到系統安全。

使用Visual Studio在Linux Docker容器中編譯C++程式

以上命令中的-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”即可新增一個遠端連線。如下圖所示:

使用Visual Studio在Linux Docker容器中編譯C++程式

這裡的host name應該為localhost,埠則配置為SSH連線的埠(在這個例子中,我們使用5000這個埠),然後輸入正確的賬號和密碼即可。

在Visual Studio中配置編譯環境

目前我們新建的CMake工程還是和其他的普通CMake工程差不多。為了能在我們的Linux容器中配置和編譯控制檯程式,我們需要在配置下來框中做一些配置。

使用Visual Studio在Linux Docker容器中編譯C++程式

你可以在CMake Settings編輯器張工點選綠色的加號,然後新增一個”Linux-Debug”的配置。

請確保遠端機器的名字和我們之前建立的Docker容器的名字一致。

使用Visual Studio在Linux Docker容器中編譯C++程式

儲存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? (手動狗頭保命)