Share via


/scanDependencies (Répertorier les dépendances de module sous forme standard)

Cette option de compilateur génère un fichier JSON qui répertorie les dépendances de module et d’unité d’en-tête en fonction de la proposition P1689R5 Format for describing dependencies of source filesC++ Standard.

Syntaxe

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Arguments

-
Si le tiret unique est fourni, le compilateur émet les dépendances source JSON vers stdout, ou vers l’emplacement où la sortie du compilateur est redirigée.

filename
Le compilateur écrit la sortie de dépendance source dans le nom de fichier spécifié, qui peut inclure un chemin relatif ou absolu. Le fichier est créé s’il n’existe pas.

directory
Si l’argument est un répertoire, le compilateur génère des fichiers de dépendance source dans le répertoire spécifié. Le répertoire doit exister, ou l’argument est traité comme un filename. Le nom du fichier de sortie est basé sur le nom complet du fichier d’entrée, avec une extension ajoutée .module.json . Par exemple, si le fichier fourni au compilateur est main.cpp, le nom de fichier de sortie généré est main.cpp.module.json.

Notes

L’option /scanDependencies du compilateur identifie les dépendances, les modules et les unités d’en-tête qui doivent être compilées avant de pouvoir compiler le projet qui les utilise. Par exemple, il répertorie import <library>; ou import "library"; en tant que dépendance d’unité d’en-tête et import name; en tant que dépendance de module. L’intention est de fournir ces informations dans un format commun consommable par des outils de génération tels que CMake. Pour signaler des dépendances de module et d’unité d’en-tête, vous devez également compiler à l’aide /std:c++20 ou ultérieure.

Cette option de ligne de commande est similaire et /sourceDependencies:directives/sourceDependenciesdiffère de la manière suivante :

  • La sortie utilise le P1689R5 schéma, au lieu du schéma spécifique à Microsoft généré par /sourceDependencies:directives.
  • Contrairement /sourceDependenciesà , le compilateur ne produit pas de sortie compilée. Au lieu de cela, les fichiers sont analysés pour les directives de module. Aucun code, modules ou unités d’en-tête compilés n’est généré.
  • Le fichier JSON de sortie ne répertorie pas les modules importés et les unités d’en-tête importées (.ifc fichiers), car cette option analyse uniquement les fichiers projet. Il n’existe aucun module ou unité d’en-tête généré à répertorier.
  • Seuls les modules ou unités d’en-tête directement importés sont répertoriés. Elle ne répertorie pas les dépendances des modules importés ou des unités d’en-tête elles-mêmes.
  • Les fichiers d’en-tête inclus par texte, tels que #include <file> ou #include "file" ne sont pas répertoriés comme dépendances, sauf si traduits en unité d’en-tête à l’aide de l’option /translateInclude .
  • /scanDependencies est destiné à être utilisé avant .ifc la génération de fichiers.

/scanDependencies est disponible à partir de Visual Studio 2022 version 17.2. Elle n’est pas activée par défaut.

Lorsque vous spécifiez l’option de /MP compilateur (Générer avec plusieurs processus), nous vous recommandons d’utiliser /scanDependencies avec un argument de répertoire. Si vous fournissez un seul argument de nom de fichier, deux instances du compilateur peuvent tenter d’ouvrir le fichier de sortie simultanément et provoquer une erreur. L’utilisation de l’option /MP avec /scanDependencies- laquelle envoyer la sortie stdout peut entraîner des résultats entrelacés.

Lorsqu’une erreur de compilateur non irrécupérable se produit, les informations de dépendance sont toujours écrites dans le fichier de sortie.

Tous les chemins d’accès de fichier apparaissent sous forme de chemins absolus dans la sortie.

Pour plus d’informations sur le format et le schéma utilisés dans le fichier JSON de sortie, consultez P1689R5 la section 6.

Exemples

Considérons l’exemple de code suivant :

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

Vous pouvez utiliser cette ligne de commande pour signaler les dépendances dans app.cpp:

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

Le compilateur produit un fichier JSON, output.jsonavec du contenu similaire à :

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

Nous avons utilisé ... pour abrégé les chemins signalés. Le rapport contient les chemins absolus. Les chemins signalés dépendent de l’emplacement où le compilateur trouve les dépendances. Si les résultats sont inattendus, vous pouvez case activée paramètres de chemin d’accès de votre projet.

Aucun fichier n’est .ifc répertorié dans la sortie, car ils n’ont pas été générés. Contrairement /sourceDependenciesà ce qui suit, le compilateur ne produit pas de sortie compilée lorsqu’il /scanDependencies est spécifié. Par conséquent, aucun module ou unité d’en-tête compilé n’est généré pour l’importation.

Pour définir cette option de compilateur dans Visual Studio

Vous ne devez normalement pas définir l’option /scanDependencies dans l’environnement de développement Visual Studio. Le compilateur ne génère pas de fichiers objet lorsque vous définissez cette option, ce qui rend l’étape du lien échouer et signaler une erreur.

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir les propriétés du compilateur et de la génération.

  2. Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Ligne de commande.

  3. Modifiez la propriété Options supplémentaires pour ajouter /scanDependencies- ou /scanDependencies "pathname", où "pathname" fait référence à un répertoire pour la sortie.

  4. Sélectionnez OK pour enregistrer vos modifications.

Pour signaler les dépendances du module et de l’unité d’en-tête, vous devez également définir la >>propriété Standard du langage C++ C++ général sur ISO C++20 Standard ou version ultérieure.

Pour définir cette option du compilateur par programmation

Voir aussi

Options du compilateur MSVC
Syntaxe de ligne de commande du compilateur MSVC
/sourceDependencies:directives
/sourceDependencies
/std (Spécifier la version du standard du langage)
/translateInclude