このコンパイラ オプションは、C++ 標準提案の P1689R5 Format for describing dependencies of source files
に従ってモジュールとヘッダーユニットの依存関係を一覧表示する JSON ファイルを生成します。
構文
/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
によって生成された Microsoft 固有のスキーマではなく、/sourceDependencies:directives
スキーマが使用されます。 -
/sourceDependencies
とは異なり、コンパイラはコンパイルされた出力を生成しません。 代わりに、ファイルはモジュール ディレクティブをスキャンします。 コンパイル済みのコード、モジュール、またはヘッダー ユニットは生成されません。 - このオプションではプロジェクト ファイルのみがスキャンされるため、出力 JSON ファイルには、インポートされたモジュールとインポートされたヘッダー ユニット (
.ifc
ファイル) は一覧表示されません。 リストするビルドされたモジュールやヘッダー ユニットはありません。 - 直接インポートされたモジュールまたはヘッダー ユニットのみが一覧表示されます。 インポートされたモジュールまたはヘッダー ユニット自体の依存関係は一覧表示されません。
-
#include <file>
オプションを使用してヘッダー ユニットに変換しない限り、#include "file"
や/translateInclude
などのテキストに含まれるヘッダー ファイルは依存関係として一覧表示されません。 -
/scanDependencies
は、.ifc
ファイルをビルドする前に使用することを意図しています。
/scanDependencies
は、Visual Studio 2022 バージョン 17.2 以降で使用できます。 これは、既定では有効になっていません。
/MP
(複数のプロセスを使用したビルド) コンパイラ オプションを指定する場合は、ディレクトリ引数で/scanDependencies
を使用することをお勧めします。 1 つのファイル名引数を指定すると、コンパイラの 2 つのインスタンスが同時に出力ファイルを開こうとし、エラーが発生する可能性があります。
/MP
で/scanDependencies-
を使用して出力をstdout
に送信すると、インターリーブ結果が発生する可能性があります。
致命的でないコンパイラ エラーが発生しても、依存関係情報は出力ファイルに書き込まれます。
すべてのファイル パスは、出力に絶対パスとして表示されます。
出力 JSON ファイルで使用される形式とスキーマの詳細については、 P1689R5
セクション 6 を参照してください。
例示
次のサンプル コードについて考えてみましょう。
//app.cpp:
#include <vector>
import other.module;
import std;
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": [
"output.json"
],
"requires": [
{
"logical-name": "other.module"
},
{
"logical-name": "std"
},
{
"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
}
]
}
]
}
...
を使用して、報告されたパスを省略しました。 レポートには絶対パスが含まれています。 報告されるパスは、コンパイラが依存関係を検出する場所によって異なります。 結果が予期しない場合は、プロジェクトのインクルード パスの設定を確認できます。
ビルドされていないため、出力に .ifc
ファイルは一覧表示されません。
/sourceDependencies
とは異なり、/scanDependencies
が指定されている場合、コンパイラはコンパイル済み出力を生成しないため、インポートするコンパイル済みモジュールまたはヘッダー ユニットは生成されません。
このコンパイラ オプションを Visual Studio で使用するには
通常は、Visual Studio 開発環境で /scanDependencies
オプションを設定しないでください。 このオプションを設定すると、コンパイラによってオブジェクト ファイルが生成されないため、リンク ステップが失敗し、エラーが報告されます。
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「コンパイラとビルドのプロパティを設定する」をご覧ください。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
[追加オプション] プロパティを変更して、
/scanDependencies-
または/scanDependencies "pathname"
を追加します。ここで、"pathname"
は出力用のディレクトリを参照します。[OK] を選択して変更を保存します。
モジュールとヘッダー ユニットの依存関係を報告するには、 Configuration Properties>General>C++ Language Standard プロパティをISO C++20 Standard 以降に設定する必要もあります。
このコンパイラ オプションをコードから設定するには
- AdditionalOptionsを参照してください。
こちらも参照ください
モジュールを使用して C++ 標準ライブラリをインポートする
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文
/sourceDependencies:directives
/sourceDependencies
/std
(言語標準バージョンの指定)
/translateInclude