/scanDependencies
(Перечисление зависимостей модуля в стандартной форме)
Этот параметр компилятора создает JSON-файл, который перечисляет зависимости модулей и единиц заголовков в соответствии с предложением P1689R5 Format for describing dependencies of source files
C++ 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. Компилятор не создает файлы объектов при установке этого параметра, что делает шаг ссылки неудачным и сообщить об ошибке.
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
Измените свойство "Дополнительные параметры ", чтобы добавить
/scanDependencies-
или/scanDependencies "pathname"
, где"pathname"
ссылается на каталог для выходных данных.Нажмите ОК, чтобы сохранить внесенные изменения.
Чтобы сообщить о зависимостях модуля и блока заголовков, необходимо также задать свойство "Общие свойства>>конфигурации" языка C++ "Стандартный" на ISO C++20 standard или более поздней версии.
Установка данного параметра компилятора программным способом
- См. раздел AdditionalOptions.
См. также
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC
/sourceDependencies:directives
/sourceDependencies
/std
(определение стандартной версии языка)
/translateInclude