/scanDependencies (Listenmodulabhängigkeiten im Standardformular)

Diese Compileroption generiert eine JSON-Datei, die Modul- und Headereinheitsabhängigkeiten gemäß dem C++-Standardvorschlag P1689R5 Format for describing dependencies of source filesauflistet.

Syntax

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Argumente

-
Wenn der einzelne Gedankenstrich bereitgestellt wird, gibt der Compiler die Quellabhängigkeiten JSON an stdoutoder an den Ort, an den die Compilerausgabe umgeleitet wird.

filename
Der Compiler schreibt die Quellabhängigkeitsausgabe in den angegebenen Dateinamen, der einen relativen oder absoluten Pfad enthalten kann. Wenn die Datei nicht vorhanden ist, wird sie erstellt.

directory
Wenn das Argument ein Verzeichnis ist, generiert der Compiler Quellabhängigkeitsdateien im angegebenen Verzeichnis. Das Verzeichnis muss vorhanden sein, oder das Argument wird als ein filename. Der Name der Ausgabedatei basiert auf dem vollständigen Namen der Eingabedatei mit einer angefügten .module.json Erweiterung. Wenn die dem Compiler bereitgestellte Datei beispielsweise lautet main.cpp, lautet main.cpp.module.jsonder generierte Ausgabedateiname .

Hinweise

Die /scanDependencies Compileroption identifiziert, welche Abhängigkeiten, Module und Headereinheiten kompiliert werden müssen, bevor Sie das Projekt kompilieren können, das sie verwendet. So wird beispielsweise eine Abhängigkeit der Kopfzeileneinheit und import name; als Modulabhängigkeit aufgelistet.import <library>; import "library"; Diese Informationen sollen in einem gängigen Format bereitgestellt werden, das von Buildtools wie CMake verwendet wird. Um Abhängigkeiten von Modul- und Headereinheiten zu melden, müssen Sie auch mithilfe /std:c++20 oder höher kompilieren.

Diese Befehlszeilenoption ähnelt /sourceDependencies:directives und /sourceDependenciesunterscheidet sich jedoch auf folgende Weise:

  • Die Ausgabe verwendet das P1689R5 Schema anstelle des von Microsoft generierten /sourceDependencies:directivesSchemas.
  • Im Gegensatz dazu /sourceDependencieserzeugt der Compiler keine kompilierte Ausgabe. Stattdessen werden die Dateien nach Moduldirektiven gescannt. Es werden keine kompilierten Code-, Modul- oder Headereinheiten erstellt.
  • Die JSON-Ausgabedatei listet keine importierten Module und importierten Headereinheiten (.ifc Dateien) auf, da diese Option nur die Projektdateien überprüft. Es gibt keine integrierten Module oder Headereinheiten, die auflisten sollen.
  • Es werden nur direkt importierte Module oder Kopfzeileneinheiten aufgelistet. Es werden nicht die Abhängigkeiten der importierten Module oder Headereinheiten selbst aufgeführt.
  • Textbezogene Headerdateien wie #include <file> z. B. oder #include "file" werden nicht als Abhängigkeiten aufgeführt, es sei denn, sie werden mithilfe der /translateInclude Option in eine Kopfzeileneinheit übersetzt.
  • /scanDependencies soll verwendet werden, bevor .ifc Dateien erstellt werden.

/scanDependencies ab Visual Studio 2022, Version 17.2, verfügbar. Er ist nicht standardmäßig aktiviert.

Wenn Sie die /MP Compileroption (Build mit mehreren Prozessen) angeben, empfehlen wir die Verwendung /scanDependencies mit einem Verzeichnisargument. Wenn Sie ein einzelnes Dateinamenargument angeben, versuchen zwei Instanzen des Compilers möglicherweise, die Ausgabedatei gleichzeitig zu öffnen und einen Fehler zu verursachen. Die Verwendung von "Mit/scanDependencies-" zum Senden der /MP Ausgabe stdout kann zu überlappenden Ergebnissen führen.

Wenn ein nicht schwerwiegender Compilerfehler auftritt, werden die Abhängigkeitsinformationen weiterhin in die Ausgabedatei geschrieben.

Alle Dateipfade werden als absolute Pfade in der Ausgabe angezeigt.

Ausführliche Informationen zum Format und schema, das in der JSON-Ausgabedatei verwendet wird, finden Sie in P1689R5 Abschnitt 6.

Beispiele

Sehen Sie sich den folgenden Beispielcode an:

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

Sie können diese Befehlszeile verwenden, um Abhängigkeiten in app.cpp:

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

Der Compiler erzeugt eine JSON-Datei mit output.jsonähnlichem Inhalt:

{
    "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
                }
            ]
        }
    ]
}

Wir haben die gemeldeten Pfade früher ... gekürzt. Der Bericht enthält die absoluten Pfade. Die gemeldeten Pfade hängen davon ab, wo der Compiler die Abhängigkeiten findet. Wenn die Ergebnisse unerwartet sind, sollten Sie die Pfadeinstellungen Ihres Projekts überprüfen.

In der Ausgabe sind keine .ifc Dateien aufgeführt, da sie nicht erstellt wurden. Im Gegensatz dazu /sourceDependencieserzeugt der Compiler keine kompilierte Ausgabe, wenn /scanDependencies angegeben wird, daher werden keine kompilierten Module oder Headereinheiten zum Importieren erstellt.

So legen Sie diese Compileroption in Visual Studio fest

Normalerweise sollten Sie die /scanDependencies Option in der Visual Studio-Entwicklungsumgebung nicht festlegen. Der Compiler generiert keine Objektdateien, wenn Sie diese Option festlegen, wodurch der Verknüpfungsschritt fehlschlägt und einen Fehler meldet.

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen finden Sie unter Festlegen von Compiler- und Buildeigenschaften.

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. Ändern Sie die Eigenschaft "Zusätzliche Optionen ", um sie hinzuzufügen /scanDependencies- oder /scanDependencies "pathname", wobei "pathname" auf ein Verzeichnis für die Ausgabe verwiesen wird.

  4. Klicken Sie auf OK, um die Änderungen zu speichern.

Wenn Sie Modul- und Headereinheitsabhängigkeiten melden möchten, müssen Sie auch die Standardeigenschaft für Konfigurationseigenschaften>>für C++-Sprachen auf ISO C++20 Standard oder höher festlegen.

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch

MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile
/sourceDependencies:directives
/sourceDependencies
/std (Standardversion für die Sprache festlegen)
/translateInclude