Visual Studio 中 C++ 組建系統的開啟資料夾支援
Visual Studio 2017 和更新版本中提供 [開啟資料夾] 功能。
在 Visual Studio 2017 及之後的版本中,能利用「開啟資料夾」功能,開啟原始程式檔的資料夾,並立即開始撰寫程式碼,同時還支援 IntelliSense、瀏覽、重構、偵錯等等。 當您編輯、建立、移動或刪除檔案時,Visual Studio 會自動追蹤變更並持續更新其 IntelliSense 索引。 不會載入 .sln 或 .vcxproj 檔案;如有需要,您可以指定自訂工作,以及透過簡單的.JSON 檔案建置並啟動參數。 這項功能可讓您將任何第三方建置系統整合到Visual Studio中。 如需開啟資料夾的一般資訊,請參閱在 Visual Studio 中開發程式碼而無須專案或解決方案。
CMake 和 Qt
CMake 已整合在 Visual Studio IDE 中,作為C++桌面工作負載的元件。 CMake 的工作流程與本文中所述的工作流程不同。 如果您使用 CMake,請參閱 Visual Studio 中的 CMake 專案。 您也可以使用 CMake 來建置 Qt 專案,也可以使用 Visual Studio 2015 或 Visual Studio 2017 的 Qt Visual Studio 擴充功能 。
其他建置系統
若要搭配建置系統或編譯程式工具組使用Visual Studio IDE,但未直接從主功能表選取 [檔案] |開啟 |資料夾 或按 Ctrl + Shift + Alt + O。流覽至包含原始碼檔案的資料夾。 若要建置專案,請設定 IntelliSense 並設定偵錯參數,您可以新增三個 JSON 檔案:
檔案 | 說明 |
---|---|
CppProperties.json | 指定自訂組態資訊以供瀏覽。 如有需要,請在您的根專案資料夾中建立此檔案。 (不會在 CMake 專案中使用。) |
tasks.vs.json | 指定自訂建置命令。 存取方式為透過 [方案總管] 的操作功能表項目 [設定工作]。 |
launch.vs.json | 指定偵錯工具的命令列引數。 存取方式為透過 [方案總管] 的操作功能表項目 [偵錯並啟動設定]。 |
使用 CppProperties.json 設定程式碼導覽
針對 IntelliSense 和瀏覽行為,例如 [移至定義 ] 才能正常運作,Visual Studio 必須知道您使用的編譯程式、系統標頭所在的位置,以及如果檔案不是直接位於您已開啟的資料夾中,則為任何其他 Include 檔案的位置(工作區資料夾)。 若要指定組態,您可以從主要工具列的下拉式清單中選擇 [ 管理 組態]:
Visual Studio 提供下列預設組態:
例如,如果您選擇 x64-Debug,Visual Studio 會在根項目資料夾中建立名為 CppProperties.json 的檔案:
{
"configurations": [
{
"inheritEnvironments": [
"msvc_x64"
],
"name": "x64-Debug",
"includePath": [
"${env.INCLUDE}",
"${workspaceRoot}\\**"
],
"defines": [
"WIN32",
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"intelliSenseMode": "windows-msvc-x64"
}
]
}
此設定會繼承 Visual Studio x64 開發人員命令提示字元的環境變數。 其中一個變數是 INCLUDE
,您可以使用 巨集在這裡 ${env.INCLUDE}
參考它。 屬性 includePath
會告知 Visual Studio 要在哪裡尋找 IntelliSense 所需的所有來源。 在此情況下,它表示「查看 INCLUDE 環境變數所指定的所有目錄,以及目前工作資料夾樹狀目錄中的所有目錄」。屬性 name
是會出現在下拉式清單中的名稱,而且可以是您想要的任何專案。 屬性 defines
會在遇到條件式編譯區塊時,提供 IntelliSense 的提示。 屬性 intelliSenseMode
會根據編譯程式類型提供一些額外的提示。 MSVC、GCC 和 Clang 有數個選項可供使用。
注意
如果 Visual Studio 似乎忽略CppProperties.json中的設定,請嘗試將例外狀況新增至 .gitignore 檔案,如下所示:!/CppProperties.json
。
MinGW-w64 的預設組態
如果您新增 MinGW-W64 設定,JSON 會如下所示:
{
"configurations": [
{
"inheritEnvironments": [
"mingw_64"
],
"name": "Mingw64",
"includePath": [
"${env.INCLUDE}",
"${workspaceRoot}\\**"
],
"intelliSenseMode": "linux-gcc-x64",
"environments": [
{
"MINGW64_ROOT": "C:\\msys64\\mingw64",
"BIN_ROOT": "${env.MINGW64_ROOT}\\bin",
"FLAVOR": "x86_64-w64-mingw32",
"TOOLSET_VERSION": "9.1.0",
"PATH": "${env.BIN_ROOT};${env.MINGW64_ROOT}\\..\\usr\\local\\bin;${env.MINGW64_ROOT}\\..\\usr\\bin;${env.MINGW64_ROOT}\\..\\bin;${env.PATH}",
"INCLUDE": "${env.MINGW64_ROOT}\\include\\c++\\${env.TOOLSET_VERSION};${env.MINGW64_ROOT}\\include\\c++\\${env.TOOLSET_VERSION}\\tr1;${env.MINGW64_ROOT}\\include\\c++\\${env.TOOLSET_VERSION}\\${env.FLAVOR}",
"environment": "mingw_64"
}
]
}
]
}
記下 區塊 environments
。 它會定義屬性,這些屬性的行為就像環境變數一樣,而且不僅可在CppProperties.json檔案中使用,也會在task.vs.json和launch.vs.json的其他組態檔中使用。 組 Mingw64
態會 mingw_w64
繼承環境,並使用其 INCLUDE
屬性來指定的值 includePath
。 您可以視需要將其他路徑新增至這個數位屬性。
屬性 intelliSenseMode
會設定為適用於 GCC 的值。 如需所有這些屬性的詳細資訊,請參閱 CppProperties 架構參考。
當一切正常運作時,當您將滑鼠停留在類型上方時,就會看到 GCC 標頭中的 IntelliSense:
啟用 IntelliSense 診斷
如果您看不到預期的 IntelliSense,您可以移至 [工具>選項>] 文字編輯器>C/C++> [進一步],並將 [啟用記錄] 設定為 true
來進行疑難解答。 若要從 開始,請嘗試將 [記錄層級] 設定為 5,並將 [記錄篩選] 設定為 8。
輸出會管線傳送至 [輸出視窗 ],當您選擇 [顯示輸出來源:Visual C++ 記錄檔時,會顯示輸出。 輸出包含 IntelliSense 嘗試使用的實際 Include 路徑清單。 如果路徑不符合CppProperties.json中的路徑,請嘗試關閉資料夾,並刪除包含快取瀏覽資料的 .vs 子資料夾。
使用 tasks.vs.json 定義建置工作
您可以針對您目前在工作區中所擁有的檔案自動化建置指令碼或任何其他外部作業,方法是直接在 IDE 中以工作的形式執行它們。 您能以滑鼠右鍵按一下檔案或資料夾,並選取 [設定工作] 來設定新工作。
這會在 Visual Studio 在根項目資料夾中建立的 .vs 資料夾中,建立 tasks.vs.json 檔案。 您可以在此檔案中定義任意工作,然後從 [方案總管] 操作功能表叫用它。 若要繼續 GCC 範例,下列代碼段會顯示完整的 tasks.vs.json 檔案,並做為單一工作, 叫用g++.exe 來建置專案。 假設專案包含名為 hello.cpp 的單一檔案。
{
"version": "0.2.1",
"tasks": [
{
"taskLabel": "build hello",
"appliesTo": "/",
"type": "default",
"command": "g++",
"args": [
"-g",
"-o",
"hello",
"hello.cpp"
]
}
]
}
JSON 檔案會放在 .vs 子資料夾中。 若要查看該資料夾,請按兩下 方案總管 頂端的 [顯示所有檔案] 按鈕。 您可以以滑鼠右鍵按兩下 方案總管中的根節點並選擇build hello 來執行這項工作。 當工作完成時,您應該會看到新的檔案,hello.exe 方案總管。
您可以定義許多種類的工作。 下列範例示範定義單一工作的 tasks.vs.json 檔案。 taskLabel
定義出現在操作功能表中的名稱。 appliesTo
定義可執行該命令的檔案。 屬性 command
會參考 COMSPEC 環境變數,該變數會識別控制台的路徑(cmd.exe 在 Windows 上)。 您也可以參考 CppProperties.json 或 CMakeSettings.json 中宣告的環境變數。 args
屬性指定要叫用的命令列。 ${file}
巨集會在 [方案總管] 中擷取選取的檔案。 下列範例會顯示目前所選 .cpp 檔案的檔名。
{
"version": "0.2.1",
"tasks": [
{
"taskLabel": "Echo filename",
"appliesTo": "*.cpp",
"type": "command",
"command": "${env.COMSPEC}",
"args": ["echo ${file}"]
}
]
}
儲存 tasks.vs.json之後,您可以在資料夾中的任何 .cpp 檔案上按下滑鼠右鍵,從操作功能表中選擇 [Echo 檔名 ],然後查看 [輸出] 視窗中顯示的檔名。
如需詳細資訊,請參閱 Tasks.vs.json 結構描述參考。
使用 launch.vs.json 設定偵錯參數
若要自定義程式的命令行自變數和偵錯指示,請以滑鼠右鍵按兩下 方案總管 中的可執行檔,然後選取 [偵錯] 和 [啟動設定]。 這會開啟現有的 launch.vs.json 檔案,如果沒有,則會建立具有一組最小啟動設定的新檔案。 首先,您可以選擇您想要設定的偵錯會話類型。 針對 MinGw-w64 專案進行偵錯,我們選擇 [C/C++啟動] 作為 MinGW/Cygwin (gdb)。 這會建立啟動組態,以搭配 一些受過教育的預設值使用 gdb.exe 。 其中預設值是 MINGW_PREFIX
。 您可以替代常值路徑(如下所示),或在 CppProperties.json中定義MINGW_PREFIX
屬性:
{
"version": "0.2.1",
"defaults": {},
"configurations": [
{
"type": "cppdbg",
"name": "hello.exe",
"project": "hello.exe",
"cwd": "${workspaceRoot}",
"program": "${debugInfo.target}",
"MIMode": "gdb",
"miDebuggerPath": "c:\\msys64\\usr\\bin\\gdb.exe",
"externalConsole": true
}
]
}
若要開始偵錯,請在 [偵錯] 下拉式清單中選擇可執行檔,然後按兩下綠色箭號:
您應該會看到 [ 初始化調試程式 ] 對話框,然後看到執行程式的外部控制台視窗。
如需詳細資訊,請參閱 launch.vs.json架構參考。
啟動其他可執行檔
您可以定義電腦上任何可執行檔案的啟動設定。 下列範例會 啟動 7za ,並藉由將它們新增至 args
JSON 陣列來指定其他自變數:
{
"version": "0.2.1",
"defaults": {},
"configurations": [
{
"type": "default",
"project": "CPP\\7zip\\Bundles\\Alone\\O\\7za.exe",
"name": "7za.exe list content of helloworld.zip",
"args": [ "l", "d:\\sources\\helloworld.zip" ]
}
]
}
當您儲存此檔案時,新的組態會出現在 [偵錯目標] 下拉式清單中,且您可以選取它以啟動偵錯工具。 您可以視需要為任何數目的可執行檔建立許多偵錯組態。 如果您現在按下 F5 鍵,偵錯工具會啟動並叫用任何您可能已設定的中斷點。 現在可以使用所有熟悉的偵錯工具視窗及其功能。