分享方式:


/scanDependencies (以標準形式列出模組相依性)

此編譯程式選項會產生 JSON 檔案,根據標準提案 P1689R5 Format for describing dependencies of source filesC++列出模組和標頭單位相依性。

語法

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

引數

-
如果提供單一破折號,則編譯程式會將來源相依性 JSON 發出至 stdout,或重新導向編譯程序輸出的位置。

filename
編譯程式會將來源相依性輸出寫入指定的檔名,其中可能包含相對或絕對路徑。 如果檔案不存在,就會建立檔案。

directory
如果自變數是目錄,編譯程式會在指定的目錄中產生來源相依性檔案。 目錄必須存在,否則自變數會 filename被視為 。 輸出檔名是以輸入檔的完整名稱為基礎,擴展名為附加 .module.json 。 例如,如果提供給編譯程式的檔案是 main.cpp,產生的輸出檔名是 main.cpp.module.json

備註

編譯 /scanDependencies 程式選項會識別必須先編譯哪些相依性、模組和標頭單位,才能編譯使用這些相依性、模組和標頭單位的專案。 例如,它會列出 import <library>;import "library"; 作為標頭單位相依性,以及 import name; 作為模組相依性。 其目的是要透過 CMake 等建置工具,以通用格式提供這項資訊。 若要報告模組和標頭單位相依性,您也必須使用 /std:c++20 或更新版本進行編譯。

這個命令行選項類似於 /sourceDependencies:directives/sourceDependencies,但有下列不同方式:

  • 輸出會 P1689R5 使用架構,而不是 由 /sourceDependencies:directives產生的Microsoft特定架構。
  • 不同於 /sourceDependencies,編譯程式不會產生編譯的輸出。 相反地,系統會掃描檔案中是否有模組指示詞。 不會產生任何已編譯的程式代碼、模組或標頭單位。
  • 輸出 JSON 檔案不會列出匯入的模組和匯入的標頭單位(.ifc 檔案),因為此選項只會掃描項目檔。 沒有要列出建置的模組或標頭單位。
  • 只會列出直接匯入的模組或標頭單位。 它不會列出匯入模組或標頭單位本身的相依性。
  • 除非使用 /translateInclude 選項轉譯為標頭單位,否則不會以文字方式包含的頭檔案,例如 #include <file>#include "file" 未列為相依性。
  • /scanDependencies 是要在建置檔案之前 .ifc 使用。

/scanDependencies 從 Visual Studio 2022 17.2 版開始提供。 依預設未啟用。

當您指定 /MP [使用多個進程建置] 編譯程式選項時,建議您搭配目錄自變數使用 /scanDependencies 。 如果您提供單一檔名自變數,編譯程式的兩個實例可能會嘗試同時開啟輸出檔案,並造成錯誤。 使用搭配 /MP /scanDependencies- 將輸出傳送至 stdout 可能會導致交錯的結果。

發生非嚴重編譯程序錯誤時,相依性資訊仍會寫入輸出檔案。

所有檔案路徑都會顯示為輸出中的絕對路徑。

如需輸出 JSON 檔案中使用的格式和架構的詳細資訊,請參閱 P1689R5 第 6 節。

範例

考量下列範例程式碼:

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

您可以使用此指令列來報告 中的 app.cpp相依性:

cl /std:c++latest /scanDependencies output.json app.cpp

編譯程式會產生 JSON 檔案, output.json其內容類似:

{
    "version": 1,
    "revision": 0,
    "rules": [
        {
            "primary-output": "app.obj",
            "outputs": [
                "C:\\Users\\username\\source\\repos\\app\\app"
            ],
            "requires": [
                {
                    "logical-name": "other.module"
                },
                {
                    "logical-name": "std.core"
                },
                {
                    "logical-name": "t.h",
                    "source-path": "C:\\Users\\username\\source\\repos\\app\\app\\t.h",
                    "lookup-method": "include-quote",
                    "unique-on-source-path": true
                },
                {
                    "logical-name": "iostream",
                    "source-path": "C:\\Program Files\\...\\include\\iostream",
                    "lookup-method": "include-angle",
                    "unique-on-source-path": true
                }
            ]
        }
    ]
}

我們已用來 ... 縮寫報告的路徑。 報表包含絕對路徑。 報告的路徑取決於編譯程式找到相依性的位置。 如果結果非預期,您可能會想要檢查專案的 Include 路徑設定。

輸出中未列出任何 .ifc 檔案,因為它們未建置。 不同於 /sourceDependencies,編譯程式不會在指定 時 /scanDependencies 產生已編譯的輸出,因此不會產生任何編譯的模組或標頭單位來匯入。

在 Visual Studio 中設定這個編譯器選項

您通常不應該在 Visual Studio 開發環境中設定 /scanDependencies 選項。 當您設定此選項時,編譯程式不會產生物件檔案,這會使連結步驟失敗並回報錯誤。

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 設定編譯程式和建置屬性

  2. 選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。

  3. 修改 [其他選項] 屬性以新增 /scanDependencies-/scanDependencies "pathname",其中 "pathname" 會參考輸出的目錄。

  4. 選取 [確定] 儲存您的變更。

若要報告模組和標頭單元相依性,您也必須將組態屬性>一般>C++ Language Standard 屬性設定為 ISO C++20 Standard 或更新版本。

若要以程式方式設定這個編譯器選項

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法
/sourceDependencies:directives
/sourceDependencies
/std (指定語言標準版本)
/translateInclude