Partilhar via


/scanDependencies (Listar dependências do módulo no formulário padrão)

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

Sintaxe

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Argumentos

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

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. O ficheiro é criado se não existir.

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

Observações

A /scanDependencies opção de 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 construção 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 difere das seguintes maneiras:

  • A saída usa o P1689R5 esquema, em vez do esquema específico da Microsoft gerado pelo /sourceDependencies:directives.
  • Ao contrário /sourceDependenciesdo , o compilador não produz 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 importadas (.ifc arquivos) porque essa opção verifica apenas os arquivos de projeto. Não há módulos construídos ou unidades de cabeçalho para listar.
  • Apenas módulos ou unidades de cabeçalho importados diretamente são listados. Ele não lista as dependências dos módulos importados ou unidades de cabeçalho em si.
  • Arquivos de cabeçalho incluídos textualmente, como #include <file> ou #include "file" não listados como dependências, a menos que sejam traduzidos para uma unidade de cabeçalho usando a /translateInclude opção.
  • /scanDependencies destina-se a ser usado antes .ifc que os arquivos sejam construídos.

/scanDependencies está disponível a partir do Visual Studio 2022 versão 17.2. Não está ativado por predefinição.

Quando você especifica a opção de /MP compilador (Build with multiple processes), recomendamos que você use /scanDependencies com um argumento de diretório. Se você fornecer um único argumento de nome de arquivo, duas instâncias do compilador podem tentar abrir o arquivo de saída simultaneamente e causar um erro. O uso de /MP com /scanDependencies- para enviar saída para stdout poderia causar resultados intercalados.

Quando ocorre um erro de compilador não fatal, 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, consulte P1689R5 a seção 6.

Exemplos

Considere o seguinte código de exemplo:

//app.cpp:
#include <vector>

import other.module;
import std;
import "t.h";
import <iostream>;

int main() {}

Você pode usar esta 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.jsoncom conteúdo semelhante a:

{
    "version": 1,
    "revision": 0,
    "rules": [
        {
            "primary-output": "app.obj",
            "outputs": [
                "output.json"
            ],
            "requires": [
                {
                    "logical-name": "other.module"
                },
                {
                    "logical-name": "std"
                },
                {
                    "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
                }
            ]
        }
    ]
}

Costumamos ... 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, convém verificar as configurações de caminho de inclusão do seu projeto.

Nenhum .ifc arquivo é listado na saída porque eles não foram criados. Ao contrário /sourceDependenciesdo , o compilador não produz saída compilada quando /scanDependencies é especificado, portanto, nenhum módulo compilado ou unidades de cabeçalho são produzidos para importar.

Para definir essa opção de 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 de 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 Property Pages do projeto. Para obter mais informações, consulte Definir propriedades do compilador e da compilação.

  2. Selecione a Configuration Properties>C/C++>Command Line página de propriedades.

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

  4. Escolha OK para salvar as 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 programaticamente

Ver também

Importar a biblioteca padrão C++ usando módulos
opções do compilador MSVC
de sintaxe de linha de comando do compilador MSVC
/sourceDependencies:directives
/sourceDependencies
/std (Especificar a versão normalizada da língua)
/translateInclude