Compartilhar via


/scanDependencies (listar dependências do módulo no formato padrão)

Essa opção de compilador gera um arquivo JSON que lista dependências de módulo e de unidade de cabeçalho de acordo com a proposta C++ Standard P1689R5 Format for describing dependencies of source files.

Sintaxe

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Argumentos

-
Se for fornecido o traço único, o compilador emitirá o JSON de dependências de origem para stdout ou para onde for redirecionada a saída do compilador.

filename
O compilador grava a saída de dependência de origem no nome de arquivo especificado, que pode incluir um caminho relativo ou absoluto. Se ainda não existir, o arquivo será criado.

directory
Se o argumento for um diretório, o compilador gerará arquivos de dependência de origem no diretório especificado. O diretório tem que existir ou o argumento será tratado como um filename. O nome do arquivo de saída é baseado no nome completo do arquivo de entrada, com uma extensão .module.json acrescentada. Por exemplo, se o arquivo fornecido ao compilador for main.cpp, o nome do arquivo de saída gerado será main.cpp.module.json.

Comentários

A /scanDependencies opção do compilador identifica quais dependências, módulos e unidades de cabeçalho devem ser compilados antes que você possa compilar o projeto que os usa. Por exemplo, ele lista import <library>; ou import "library"; como uma dependência de unidade de cabeçalho e import name; como uma dependência de módulo. A intenção é fornecer essas informações em um formato comum consumível por ferramentas de build, como o CMake. Para relatar dependências de módulo e unidade de cabeçalho, você também deve compilar usando /std:c++20 ou posteriormente.

Essa opção de linha de comando é semelhante a /sourceDependencies:directives e /sourceDependencies, mas é diferente das seguintes formas:

  • A saída usa o esquema P1689R5, em vez do esquema específico à Microsoft gerado por /sourceDependencies:directives.
  • Ao contrário /sourceDependencies, o compilador não produz a saída compilada. Em vez disso, os arquivos são verificados em busca de diretivas de módulo. Nenhum código compilado, módulos ou unidades de cabeçalho são produzidos.
  • O arquivo JSON de saída não lista módulos importados e unidades de cabeçalho importados (arquivos .ifc) porque essa opção verifica apenas os arquivos do projeto. Não há módulos ou unidades de cabeçalho criados para listar.
  • Somente módulos importados diretamente ou unidades de cabeçalho são listados. Ele não lista as dependências dos módulos importados ou das próprias unidades de cabeçalho.
  • Arquivos de cabeçalho incluídos em texto, como #include <file> ou #include "file" não são listados como dependências, a menos que sejam convertidos em uma unidade de cabeçalho usando a opção /translateInclude.
  • /scanDependencies destina-se a ser usado antes que os arquivos .ifc sejam criados.

/scanDependencies está disponível a partir do Visual Studio 2022 versão 17.2. Ela não vem habilitada por padrão.

Ao especificar a opção de compilador /MP (Compilar com vários processos), recomendamos que você use /scanDependencies com um argumento de diretório. Se você fornecer um argumento de nome de arquivo único, duas instâncias do compilador poderão tentar abrir o arquivo de saída simultaneamente e causar um erro. O uso de /MP com /scanDependencies- para enviar saída para stdout pode causar resultados intercalados.

Quando ocorre um erro não fatal do compilador, as informações de dependência ainda são gravadas no arquivo de saída.

Todos os caminhos de arquivo aparecem como caminhos absolutos na saída.

Para obter detalhes sobre o formato e o esquema usados no arquivo JSON de saída, confira a seção 6 de P1689R5.

Exemplos

Considere o seguinte código de exemplo:

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

Você pode usar essa linha de comando para relatar dependências em app.cpp:

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

O compilador produz um arquivo JSON, output.json, com conteúdo semelhante a:

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

Costumávamos usar ... para abreviar os caminhos relatados. O relatório contém os caminhos absolutos. Os caminhos relatados dependem de onde o compilador encontra as dependências. Se os resultados forem inesperados, talvez você queira verificar as configurações de caminho de inclusão do projeto.

Nenhum arquivo .ifc está listado na saída porque eles não foram criados. Ao contrário de /sourceDependencies, o compilador não produz a saída compilada quando /scanDependencies é especificado, portanto, nenhum módulo compilado ou unidade de cabeçalho é produzido para importação.

Para definir essa opção do compilador no Visual Studio

Normalmente, você não deve definir a /scanDependencies opção no ambiente de desenvolvimento do Visual Studio. O compilador não gera arquivos-objeto quando você define essa opção, o que faz com que a etapa de link falhe e relate um erro.

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

  3. Modifique a propriedade Opções Adicionais para adicionar /scanDependencies- ou /scanDependencies "pathname", em que "pathname" se refere a um diretório para saída.

  4. Escolha OK para salvar suas alterações.

Para relatar dependências de módulo e unidade de cabeçalho, você também deve definir a propriedade Configuration Properties>General>C++ Language Standard como ISO C++20 Standard ou posterior.

Para definir essa opção do compilador via programação

Confira também

Opções do compilador MSVC
Sintaxe de linha de comando do compilador MSVC
/sourceDependencies:directives
/sourceDependencies
/std (Especificar a versão padrão da linguagem)
/translateInclude