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