/scanDependencies
(以標準形式列出模組相依性)
此編譯程式選項會產生 JSON 檔案,根據標準提案 P1689R5 Format for describing dependencies of source files
C++列出模組和標頭單位相依性。
語法
/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
選項。 當您設定此選項時,編譯程式不會產生物件檔案,這會使連結步驟失敗並回報錯誤。
開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 設定編譯程式和建置屬性。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
修改 [其他選項] 屬性以新增
/scanDependencies-
或/scanDependencies "pathname"
,其中"pathname"
會參考輸出的目錄。選取 [確定] 儲存您的變更。
若要報告模組和標頭單元相依性,您也必須將組態屬性>一般>C++ Language Standard 屬性設定為 ISO C++20 Standard 或更新版本。
若要以程式方式設定這個編譯器選項
- 請參閱 AdditionalOptions。
另請參閱
MSVC 編譯器選項
MSVC 編譯器命令列語法
/sourceDependencies:directives
/sourceDependencies
/std
(指定語言標準版本)
/translateInclude