分享方式:


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 檔案的位置(工作區資料夾)。 若要指定組態,您可以從主要工具列的下拉式清單中選擇 [ 管理 組態]:

Configuration dropdown on the toolbar showing the Manage configurations selection.

Visual Studio 提供下列預設組態:

Add Configuration to CppProperties dialog, showing list of Default configurations: x86-Debug, x86-Release, x64-Debug, x64-Release, and so on.

例如,如果您選擇 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:

Screenshot of a GCC IntelliSense pop-up showing the header documentation.

啟用 IntelliSense 診斷

如果您看不到預期的 IntelliSense,您可以移至 [工具 > 選項 > 文字編輯器 > C/C++ > 進階 ] 進行疑難排解,並將 [啟用記錄 ] 設定 為 。 true 若要從 開始,請嘗試將 [記錄層級 ] 設定為 5,並將 [記錄篩選] 設定 為 8。

Options dialog, showing the Diagnostic logging settings.

輸出會管線傳送至 [輸出] 視窗 ,當您選擇 [ 顯示輸出來源:Visual C++ 記錄 檔] 時會顯示。 輸出包含 IntelliSense 嘗試使用的實際 Include 路徑清單。 如果路徑不符合 CppProperties.json 中的 路徑,請嘗試關閉資料夾,並刪除 包含快取流覽資料的 .vs 子資料夾。

使用 tasks.vs.json 定義建置工作

您可以針對您目前在工作區中所擁有的檔案自動化建置指令碼或任何其他外部作業,方法是直接在 IDE 中以工作的形式執行它們。 您能以滑鼠右鍵按一下檔案或資料夾,並選取 [設定工作] 來設定新工作。

Solution Explorer shortcut menu showing the Configure Tasks command.

這會在 Visual Studio 在根專案資料夾中建立的 .vs.json 檔案中建立 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 子資料夾中。 若要查看該資料夾,請按一下方案總管 頂端的 [ 顯示所有檔案 ] 按鈕。 您可以在 方案總管 中的 根節點上按一下滑鼠右鍵,然後選擇 [建置 hello ],以執行這項工作。 當工作完成時, 您應該會在 方案總管 中看到 新的檔案 hello.exe

您可以定義許多種類的工作。 下列範例示範定義單一工作的 tasks.vs.json 檔案。 taskLabel 定義出現在操作功能表中的名稱。 appliesTo 定義可執行該命令的檔案。 屬性 command 會參考 COMSPEC 環境變數,此變數會識別主控台的路徑( Windows 上的 cmd.exe )。 您也可以參考 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 專案,請選擇 MinGW/Cygwin (gdb) 的 C/C++ 啟動。 這會建立啟動組態,以使用 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
    }
  ]
}

若要開始偵錯,請在 [偵錯] 下拉式清單中選擇可執行檔,然後按一下綠色箭號:

Toolbar debug target dropdown, showing the green arrow to start the debugger.

您應該會看到 [ 初始化偵錯工具 ] 對話方塊,然後看到執行程式的外部主控台視窗。

如需詳細資訊,請參閱 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 鍵,偵錯工具會啟動並叫用任何您可能已設定的中斷點。 現在可以使用所有熟悉的偵錯工具視窗及其功能。