教學課程:在Visual Studio中建立 C++ 跨平台專案
Visual Studio C 和 C++ 開發不再僅限於 Windows。 本教學課程示範如何在 Windows 和 Linux 上使用 Visual Studio for 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分鐘。
設定 Linux 電腦執行跨平台 C++ 開發
Visual Studio 不需要任何特定的 Linux 發行版本。 OS 可以在實體機器、VM 或雲端中執行。 您也可以使用 Windows 子系統 Linux 版 (WSL)。 不過,在本教學課程中,需要圖形化環境。 這裏不建議使用 WSL,因為它主要是針對命令行作業。
Visual Studio 需要 Linux 電腦上的這些工具:C++ 編譯程式、
gdb
、ssh
、rsync
、make
和zip
。 在 Debian 型系統上,您可以使用此命令來安裝這些相依性:sudo apt install -y openssh-server build-essential gdb rsync make zip
Visual Studio 在已啟用伺服器模式的 Linux 電腦上需要最新版本的 CMake(至少 3.8)。 Microsoft 會產生 CMake 的通用組建,您可以安裝在任何的 Linux 發行版本。 建議您使用此組建,以確保您擁有最新的功能。 您可以在 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 電腦上的 Git For Windows。
GitHub 帳戶。
從 GitHub 複製開放原始碼 CMake 專案
本教學課程使用 GitHub 上的 Bullet Physics SDK。 它為許多應用程式提供碰撞偵測和物理模擬。 SDK 包含可編譯和執行的範例可執行程式,而不需要撰寫其他程序代碼。 本教學課程不會修改任何原始碼或建置腳本。 若要開始,請在已安裝 Visual Studio 的電腦上,從 GitHub 複製 bullet3 存放庫。
git clone https://github.com/bulletphysics/bullet3.git
在 Visual Studio 主功能表上,選擇 [ 檔案 > 開啟 > CMake]。 流覽至
CMakeLists.txt
您下載之 bullet3 存放庫根目錄中的檔案。一旦您開啟資料夾,您的資料夾結構就會顯示在 方案總管 中。
此檢視會顯示磁碟的確切內容,而不是邏輯或篩選過的檢視。 根據預設,不會顯示隱藏的檔案。
選擇 [ 顯示所有檔案] 按鈕,以查看資料夾中的所有檔案。
切換至目標檢視
當您開啟使用 CMake 的資料夾時,Visual Studio 會自動產生 CMake 快取。 這項作業可能需要一些時間,視您的專案大小而定。
在 [輸出視窗] 中,選取 [顯示輸出來源],然後選擇 [CMake] 監視快取產生程序的狀態。 作業完成時,會顯示「完成目標資訊擷取」。
完成此作業之後,會設定 IntelliSense。 您可以建置項目並偵錯應用程式。 Visual Studio 現在會根據 CMakeLists 檔案中指定的目標,顯示解決方案的邏輯檢視。
使用 [方案總管] 的 [解決方案與資料夾] 按鈕切換至 CMake 目標檢視。
以下是項目符號 SDK 的檢視外觀:
目標檢視提供此來源基底的更直觀檢視。 您會看到有些目標是程式庫,有些則是可執行檔。
展開 CMake 目標檢視中的節點,查看其原始程式碼檔案,無論這些檔案是否可能位於磁碟上。
新增明確的 Windows x64 偵錯組態
Visual Studio 會建立 Windows 的預設 x64 偵錯 組態。 組態是 Visual Studio 了解將為 CMake 使用何種平台目標的方法。 預設組態不會呈現在磁碟上。 當您明確新增組態時,Visual Studio 會建立名為 CMake 設定.json 的檔案。 它會填入您指定之所有組態的設定。
新增組態。 開啟工具列中的 [ 組態 ] 下拉式清單,然後選取 [ 管理組態]。
[CMake 設定 編輯器] 隨即開啟。 選取編輯器左側的綠色加號,以新增組態。 [將組態新增至 CMake 設定] 對話框隨即出現:
此對話框會顯示 Visual Studio 隨附的所有設定,以及您建立的任何自定義組態。 如果您想要繼續使用 x64-Debug 組態,該組態應該是您新增的第一個組態。 選取 x64-Debug,然後選擇 [ 選取] 按鈕。 Visual Studio 會使用 x64-Debug 的組態建立 CMake 設定.json 檔案,並將它儲存至磁碟。 您可以直接在 CMakeSettings.json 中變更 name 參數,使用您喜歡的任何組態名稱。
在 Windows 上設定斷點、建置及執行
在此步驟中,我們會偵錯示範專案符號物理連結庫的範例程式。
在 [方案總管] 中,選取並展開 AppBasicExampleGui。
開啟
BasicExample.cpp
檔案。設定當您在執行中的應用程式中按下時,會叫用的斷點。 Click 事件是在 helper 類別內的方法中處理。 若要快速獲得此結果:
選取
CommonRigidBodyBase
結構BasicExample
衍生自 。 它圍繞第30行。按一下滑鼠右鍵選擇 [移至定義]。 現在您位於 CommonRigidBodyBase.h 標頭中。
在來源上方的瀏覽器檢視中,您應該會看到您位於
CommonRigidBodyBase
。 您可以在右邊選取要檢查的成員。 開啟下拉式清單,然後選取mouseButtonCallback
以移至標頭中該函式的定義。
將中斷點放在此函式的第一行。 當您在應用程式視窗內按下滑鼠按鈕時,會在 Visual Studio 調試程式下執行時叫用它。
若要啟動應用程式,請選取工具列中的 [啟動] 下拉式清單。 它是綠色播放圖示,上面寫著「選取啟始專案」。在下拉式清單中,選取 [AppBasicExampleGui.exe]。 可執行檔的名稱現在會顯示在 [啟動] 按鈕上:
選擇 [啟動] 按鈕來建置應用程式和必要的相依性,然後使用附加的Visual Studio 調試程式加以啟動。 一會兒後,正在執行的應用程式即會出現:
將滑鼠移至應用程式視窗中,然後按一下按鈕觸發中斷點。 斷點會將Visual Studio帶回前景,編輯器會顯示暫停執行的行。 您可以檢查應用程式變數、物件、線程和記憶體,或以互動方式逐步執行程序代碼。 選擇 [ 繼續] 讓應用程式繼續,然後正常結束。 或者,使用停止按鈕停止 Visual Studio 中的執行。
新增 Linux 組態並連線到遠端電腦
新增 Linux 組態。 以滑鼠右鍵按一下 [方案總管] 檢視中的 CMakeSettings.json 檔案,然後選取 [新增組態]。 您會看到和以前一樣的 [新增組態至 CMakeSettings] 對話方塊。 這次選取 [Linux-Debug],然後儲存 CMake 設定.json 檔案 (ctrl + s)。
Visual Studio 2019 16.6 版或更新版本 向下卷動至 CMake 設定 編輯器底部,然後選取 [顯示進階設定]。 選取 [Unix Makefiles] 作為 CMake 產生器,然後儲存 CMake 設定.json 檔案 (ctrl + s)。
在 [組態] 下拉式清單中選取 [Linux-Debug ]。
如果您是第一次連線到Linux系統,則會出現 [遠端系統] 對話框 連線。
對話框具有主機名、埠、使用者名稱、驗證類型和密碼的欄位。 除了 [埠] 設定為 22 且 [驗證類型] 設定為 [密碼] 以外,所有欄位都是空白的。
如果您已經新增遠端連線,您可以流覽至 [工具>選項>跨平臺 > 連線 ion 管理員] 來開啟此視窗。
提供 Linux 計算機的連線資訊,然後選擇 [連線]。 Visual Studio 會將該電腦新增為 CMake 設定.json 作為 Linux 偵錯的默認連線。 它也會從遠端電腦提取標頭,因此您會取得 該遠端連線特有的 IntelliSense。 接下來,Visual Studio 會將檔案傳送至遠端計算機,並在遠端系統上產生 CMake 快取。 這些步驟可能需要一些時間,視網路的速度和遠端計算機的電源而定。 您知道當訊息「目標資訊擷取完成」出現在 CMake 輸出視窗中時,即已完成。
在Linux上設定斷點、建置及執行
因為它是傳統型應用程式,因此您必須提供一些更多組態資訊給偵錯組態。
在 CMake 目標檢視中,以滑鼠右鍵按兩下 [AppBasicExampleGui],然後選擇 [偵錯] 和 [啟動] 設定,以開啟隱藏的 .vs 子資料夾中的 launch.vs.json 檔案。 這對開發環境而言是本機檔案。 如果您想要簽入它並與小組儲存在一起,您可以將它移到專案的根目錄中。 在此檔案中,已新增 AppBasicExampleGui 的組態。 這些預設設定在大部分情況下都正常運作,但不適用於此處。 因為它是桌面應用程式,因此您必須提供一些額外的資訊來啟動程式,以便在Linux電腦上看到它。
若要在 Linux 電腦上尋找環境變數
DISPLAY
的值,請執行下列命令:echo $DISPLAY
在 AppBasicExampleGui 的設定中,有參數陣列 “pipeArgs”。 它包含一行:“${debuggerCommand}”。 這是在遠端電腦上啟動
gdb
的命令。 Visual Studio 必須先將顯示匯出至此內容,才能執行該命令。 例如,如果顯示的值是:1
,請修改該行,如下所示:"export DISPLAY=:1;${debuggerCommand}",
啟動並偵錯您的應用程式。 開啟工具列中的 [ 選取啟動專案 ] 下拉式清單,然後選擇 [AppBasicExampleGui]。 接下來,選擇工具列中的綠色播放圖示,或按 F5。 應用程式及其相依性建置在遠端 Linux 電腦上,然後透過附加 Visual Studio 調試程序啟動。 在您的遠端 Linux 電腦上,您應該會看到應用程式視窗。
將滑鼠移至應用程式視窗,然後按下按鈕。 已叫用斷點。 程序執行暫停,Visual Studio 會回到前景,您會看到斷點。 您也應該會在 Visual Studio 中看到 Linux 主控台視窗。 視窗提供遠端 Linux 電腦的輸出,也可以接受 的
stdin
輸入。 就像任何 Visual Studio 視窗一樣,您可以將它停駐在您想要查看的位置。 其位置會保存在未來的會話中。視窗中的輸出表示使用 dlopen/dlsym 動態載入的 C11 函式是確定的,已建立 GL 3.0 內容,並取得直接 GLX 轉譯內容並設為目前。 視窗具有各種版本資訊,適用於GL_VENDOR、GL_VERSION、GL_SHADING_LANGUAGE_VERSION等等。
您可以檢查應用程式變數、物件、執行緒、記憶體,並使用 Visual Studio 以互動方式逐一檢查程式碼。 但這次,您會在遠端 Linux 計算機上執行所有作業,而不是本機 Windows 環境。 您可以選擇 [繼續] 讓應用程式正常繼續並結束,也可以選擇停止按鈕,如同本機執行一樣。
查看 [呼叫堆疊] 視窗,並檢視
x11OpenGLWindow
呼叫,因為 Visual Studio 是在 Linux 上啟動應用程式。callstack 會顯示 CommonRigidBodyBase::mouseMoveCallback 上的斷點,以及其前面的呼叫,例如 OnMouseMove、X11OpenGLWindow::p umpMessage 等等。
您的收獲
在本教學課程中,您會直接從 GitHub 複製程式代碼基底。 您已在 Windows 上建置、執行及偵錯,而不需修改。 然後使用相同的程式代碼基底,進行次要組態變更,以在遠端 Linux 計算機上建置、執行及偵錯。
下一步
在 Visual Studio 中深入了解設定和偵錯 CMake 專案:
CMake Projects in Visual Studio (Visual Studio 中的 CMake 專案)
設定 Linux CMake 專案
連線到遠端 Linux 電腦
自訂 CMake 建置設定
設定 CMake 偵錯工作階段
部署、執行及偵錯 Linux 專案
CMake 專案中的 CMake 預先定義組態參考vcpkg 在 Visual Studio 中安裝及使用套件與 CMake