/scanDependencies (Перечисление зависимостей модуля в стандартной форме)

Этот параметр компилятора создает JSON-файл, который перечисляет зависимости модулей и единиц заголовков в соответствии с предложением P1689R5 Format for describing dependencies of source filesC++ Standard.

Синтаксис

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Аргументы

-
Если указан один тире, компилятор выдает исходные зависимости JSON stdoutили куда перенаправляются выходные данные компилятора.

filename
Компилятор записывает выходные данные зависимостей источника в указанное имя файла, которое может включать относительный или абсолютный путь. Если файл не существует, он создается.

directory
Если аргумент является каталогом, компилятор создает исходные файлы зависимостей в указанном каталоге. Каталог должен существовать, или аргумент рассматривается как .filename Имя выходного файла основано на полном имени входного файла с добавленным .module.json расширением. Например, если файл, предоставленный компилятору, имеется main.cppимя созданного выходного файла main.cpp.module.json.

Замечания

Параметр /scanDependencies компилятора определяет, какие зависимости, модули и блоки заголовков необходимо скомпилировать перед компиляцией проекта, использующего их. Например, он перечисляет import <library>; или import "library"; как зависимость единицы заголовка, а import name; также в качестве зависимости модуля. Цель состоит в том, чтобы предоставить эти сведения в общем формате, используемом средствами сборки, такими как CMake. Чтобы сообщить о зависимостях модуля и блока заголовка, необходимо также скомпилировать с помощью /std:c++20 или более поздней версии.

Этот параметр командной строки аналогичен /sourceDependencies:directives и /sourceDependenciesотличается следующим образом:

  • Выходные данные используют схему P1689R5 вместо схемы, созданной /sourceDependencies:directivesкорпорацией Майкрософт.
  • В отличие от этого компилятор не создает скомпилированные выходные /sourceDependenciesданные. Вместо этого файлы сканируются для директив модуля. Не создаются скомпилированные коды, модули или блоки заголовков.
  • Выходной JSON-файл не перечисляет импортированные модули и импортированные блоки заголовков (.ifc файлы), так как этот параметр сканирует только файлы проекта. Для списка встроенных модулей или блоков заголовков нет.
  • Перечислены только импортированные модули или блоки заголовков. Он не перечисляет зависимости импортированных модулей или блоков заголовков.
  • Текстовые файлы заголовков, такие как #include <file> или #include "file" не перечислены в качестве зависимостей, если только не переведены в единицу заголовка с помощью /translateInclude параметра.
  • /scanDependencies Предназначено для использования перед .ifc созданием файлов.

/scanDependencies доступен начиная с Visual Studio 2022 версии 17.2. По умолчанию она отключена.

При указании /MP параметра компилятора (сборка с несколькими процессами) рекомендуется использовать /scanDependencies с аргументом каталога. Если указать один аргумент имени файла, два экземпляра компилятора могут одновременно попытаться открыть выходной файл и вызвать ошибку. Использование с /scanDependencies- отправкой выходных /MP данных, чтобы привести к stdout переключениям результатов.

При возникновении ошибки компилятора, неустранимая, сведения о зависимости по-прежнему записываются в выходной файл.

Все пути к файлам отображаются как абсолютные пути в выходных данных.

Дополнительные сведения о формате и схеме, используемой в выходном JSON-файле, см P1689R5 . в разделе 6.

Примеры

Рассмотрим следующий пример кода:

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

Эту командную строку можно использовать для отчета о зависимостях в app.cpp:

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

Компилятор создает JSON-файл output.jsonс содержимым, похожим на следующее:

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

Мы использовали для ... сокращения сообщаемых путей. Отчет содержит абсолютные пути. Пути, сообщаемые в зависимости от того, где компилятор находит зависимости. Если результаты непредвиденно, может потребоваться проверка включить параметры пути проекта.

В .ifc выходных данных нет файлов, так как они не были созданы. В отличие /sourceDependenciesот того, компилятор не создает скомпилированные выходные данные при /scanDependencies указании, поэтому для импорта не создаются скомпилированные модули или блоки заголовков.

Установка параметра компилятора в Visual Studio

Обычно не следует задавать /scanDependencies параметр в среде разработки Visual Studio. Компилятор не создает файлы объектов при установке этого параметра, что делает шаг ссылки неудачным и сообщить об ошибке.

  1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  3. Измените свойство "Дополнительные параметры ", чтобы добавить /scanDependencies- или /scanDependencies "pathname", где "pathname" ссылается на каталог для выходных данных.

  4. Нажмите ОК, чтобы сохранить внесенные изменения.

Чтобы сообщить о зависимостях модуля и блока заголовков, необходимо также задать свойство "Общие свойства>>конфигурации" языка C++ "Стандартный" на ISO C++20 standard или более поздней версии.

Установка данного параметра компилятора программным способом

См. также

Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC
/sourceDependencies:directives
/sourceDependencies
/std (определение стандартной версии языка)
/translateInclude