Compartir vía


/scanDependencies (Enumerar dependencias de módulo en formato estándar).

Esta opción del compilador genera un archivo JSON que enumera las dependencias de módulo y unidad de encabezado según la propuesta estándar de C++ P1689R5 Format for describing dependencies of source files.

Sintaxis

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Argumentos

-
Si se proporciona el guión único, el compilador emite las dependencias de origen JSON hacia stdout o hacia donde se redirija la salida del compilador.

filename
El compilador escribe la salida de la dependencia de origen en el nombre de archivo especificado, que puede incluir una ruta de acceso relativa o absoluta. Si el archivo no existe, se creará.

directory
Si el argumento es un directorio, el compilador genera archivos de dependencia de origen en el directorio especificado. El directorio debe existir. De lo contrario, el argumento se tratará como filename. El nombre del archivo de salida se basa en el nombre completo del archivo de entrada, con una extensión .module.json anexada. Por ejemplo, si el archivo proporcionado al compilador es main.cpp, el nombre de archivo de salida generado será main.cpp.module.json.

Comentarios

La /scanDependencies opción del compilador identifica qué dependencias, módulos y unidades de encabezado se deben compilar para poder compilar el proyecto que los usa. Por ejemplo, muestra import <library>; o import "library"; como una dependencia de unidad de encabezado y import name; como una dependencia de módulo. La intención es proporcionar esta información en un formato común que se pueda usar con herramientas de compilación como CMake. Para notificar las dependencias de módulo y unidad de encabezado, también debe compilar mediante /std:c++20 o posterior.

Esta opción de línea de comandos es similar a /sourceDependencies:directives y /sourceDependencies, pero presenta estas diferencias:

  • La salida usa el esquema P1689R5 en lugar del esquema específico de Microsoft que genera /sourceDependencies:directives.
  • A diferencia de /sourceDependencies, el compilador no genera una salida compilada. En su lugar, las directivas de módulo se buscan en los archivos. No se genera código, módulos ni unidades de encabezado compilados.
  • En el archivo JSON de salida no se enumeran los módulos ni las unidades de encabezado importados (archivos .ifc) porque esta opción solo examina los archivos del proyecto. No hay módulos ni unidades de encabezado compilados que enumerar.
  • Solo se muestran los módulos o unidades de encabezado importados directamente. No se enumeran las dependencias de los módulos importados ni de las unidades de encabezado en sí.
  • Los archivos de encabezado incluidos textualmente, como #include <file> o #include "file", no se muestran como dependencias a menos que se traduzcan en una unidad de encabezado mediante la opción /translateInclude.
  • /scanDependencies está pensado para usarse antes de que se compilen los archivos .ifc.

/scanDependencies está disponible a partir de la versión 17.2 de Visual Studio 2022. que no está habilitado de manera predeterminada.

Al especificar la opción del compilador /MP (Compilar con varios procesos), se recomienda usar /scanDependencies con un argumento de directorio. Si proporciona un único argumento de nombre de archivo, puede que dos instancias del compilador intenten abrir el archivo de salida simultáneamente y provoquen un error. El uso de /MP con /scanDependencies- para enviar la salida a stdout podría provocar resultados intercalados.

Cuando se produce un error del compilador no grave, la información de dependencia se sigue escribiendo en el archivo de salida.

Todas las rutas de acceso de archivo se muestran como rutas de acceso absolutas en la salida.

Para obtener más información sobre el formato y el esquema usados en el archivo JSON de salida, consulte la sección 6 de P1689R5.

Ejemplos

Observe el ejemplo de código siguiente:

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

Puede usar esta línea de comandos para notificar dependencias en app.cpp:

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

El compilador genera un archivo JSON, output.json, con contenido similar al siguiente:

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

Se ha usado ... para abreviar las rutas de acceso notificadas. El informe contiene las rutas de acceso absolutas. Las rutas de acceso notificadas dependen de dónde encuentra el compilador las dependencias. Si los resultados son inesperados, quizás le interese comprobar la configuración de la ruta de acceso de inclusión del proyecto.

No se muestra ningún archivo .ifc en la salida porque no se ha compilado. A diferencia de /sourceDependencies, el compilador no genera una salida compilada cuando se especifica /scanDependencies, por lo que no se generan módulos compilados ni unidades de encabezado que importar.

Para establecer esta opción del compilador en Visual Studio

Normalmente no debe establecer la /scanDependencies opción en el entorno de desarrollo de Visual Studio. El compilador no genera ningún archivo de objeto al establecer esta opción, lo que hace que se produzca un error en el paso de vínculo y se notifique un error.

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento de las propiedades del compilador y la compilación.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. Modifique la propiedad Opciones adicionales para agregar /scanDependencies- o /scanDependencies "pathname", donde "pathname" hace referencia a un directorio para la salida.

  4. Elija Aceptar para guardar los cambios.

Para notificar las dependencias de módulos y unidades de encabezado, también debe establecer la propiedad Propiedades>de configuración General>de C++ Language Standard en ISO C++20 Standard o posterior.

Para establecer esta opción del compilador mediante programación

Consulte también

Opciones del compilador de MSVC
Sintaxis de línea de comandos del compilador de MSVC
/sourceDependencies:directives
/sourceDependencies
/std (Especificar la versión estándar del lenguaje)
/translateInclude