Поделиться через


Устранение неполадок сборки в портах vcpkg

Это руководство предназначено для пользователей с проблемами при установке портов с помощью vcpkg.

Поиск журналов сбоев

Сбои сборки могут произойти по почти бесконечному количеству причин. Если vcpkg не удается создать порт, первым шагом для диагностики причины является чтение файлов журнала.

vcpkg создает файл журнала для каждого внешнего процесса, вызываемого при создании порта. При возникновении ошибки vcpkg выводит расположение файла журнала для последнего процесса, запущенного до возникновения ошибки. Найдите строку "Просмотреть журналы для получения дополнительных сведений": в выходных данных vcpkg.

Пример: выходные данные расположения файлов журнала

    See logs for more information:
      C:\Users\viromer\work\vcpkg\buildtrees\detect_compiler\config-x64-linux-rel-CMakeCache.txt.log
      C:\Users\viromer\work\vcpkg\buildtrees\detect_compiler\config-x64-linux-out.log

Все созданные файлы журнала можно найти, проверяя каталог порта, расположенный в $VCPKG_ROOT/buildtrees/<port>/ (замените <port> соответствующим именем портаbuildtrees).

Не удалось скачать ресурсы порта

Примечание.

Использование кэширования ресурсов может помочь устранить такие проблемы, обеспечивая постоянную доступность кэшированных ресурсов.

При установке порта возникает ошибка при скачивании ресурса из сети.

CMake Error at scripts/cmake/vcpkg_download_distfile.cmake:32 (message):

  Failed to download file with error: 1

Причина 1. URL-адрес скачивания больше не является допустимым

По причинам, которые не указаны в URL-адресах элементов управления vcpkg, могут стать недопустимыми. Сломанные ссылки можно диагностировать с помощью веб-браузера для перехода по URL-адресу скачивания, неработая ссылка создаст код состояния 404.

Действия по устранению:

1. Измените порт, чтобы использовать альтернативный URL-адрес скачивания для ресурса.

Причина 2. Хэш файла не соответствует ожидаемому SHA512

error: Failed to download from mirror set
error: File does not have the expected hash:
url: https://github.com/OpenImageIO/oiio/archive/v2.4.13.0.tar.gz
File: /home/user/vcpkg/downloads/OpenImageIO-oiio-v2-9325beef.4.13.0.tar.gz.1925416.part
Expected hash: 9325beefce55b66a58fcfc2ce93e1406558ed5f6cc37cb1e8e04aee470c4f30a14483bebfb311c329f7868afb6c508a052661c6b12d819a69f707c1a30cd9549
Actual hash: 9e887c7039995ce7c41556e09a7eed940863260a522ecf7d9bec300189026ed507da560620dfa4a619deeb679be7adf42fe3a7020ff3094df777c7934c771227

Эта ошибка возникает, когда файл вышестоящий был изменен каким-либо образом сервером, но URL-адрес скачивания сохраняется одинаково. В качестве меры безопасности vcpkg отклонит файлы с SHA512, которые не соответствуют ожидаемому SHA512 для ресурса.

Действия по устранению:

1. Убедитесь, что скачанный файл защищен 2. Измените порт, чтобы использовать SHA512 нового файла.

Цепочка инструментов Visual Studio не найдена

При установке порта vcpkg не удается найти соответствующую цепочку инструментов:

error: in triplet arm-windows: Unable to find a valid toolchain for requested target architecture arm.
The selected Visual Studio instance is at: C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools
The available toolchain combinations are: x86, amd64, x86_amd64, amd64_x86

Причина 1. Соответствующая цепочка инструментов для целевой архитектуры не установлена

Если экземпляр Visual Studio соответствует требуемой версии vcpkg и вы получите эту ошибку, скорее всего, причина заключается в том, что соответствующая цепочка инструментов не установлена.

  • Откройте Visual Studio Installer и установите соответствующую цепочку инструментов.

Причина 2. Выбранная версия Visual Studio является неправильной

Если установлен необходимый цепочка инструментов, vcpkg может выбрать неправильную версию Visual Studio, в которой цепочка инструментов не установлена. Дополнительные сведения см. в документации по алгоритму выбора Visual Studio.

Действия по устранению:

1. Установите VCPKG_PLATFORM_TOOLSET соответствующую версию. 2. Кроме того, задайте нужный VCPKG_VISUAL_STUDIO_PATH путь установки экземпляра Visual Studio.

Отсутствующие системные зависимости

Необходимое средство сборки или зависимость системы не устанавливается в среде.

Пример. Для порта требуются системные зависимости

alsa currently requires the following programs from the system package manager:
    autoconf autoheader aclocal automake libtoolize
On Debian and Ubuntu derivatives:
    sudo apt install autoconf libtool
On recent Red Hat and Fedora derivatives:
    sudo dnf install autoconf libtool
On Arch Linux and derivatives:
    sudo pacman -S autoconf automake libtool
On Alpine:
    apk add autoconf automake libtool

Большинство портов vcpkg, требующих системных зависимостей, печатают сообщение во время установки. В некоторых случаях список обязательных системных зависимостей может быть неполным. Диагностика этого типа проблем зависит от базовой встроенной системы, проверка журналы ошибок, чтобы определить причину сбоя.

Действия по устранению:

1. Выполните необходимые действия для установки отсутствующих системных зависимостей в вашей среде.

Зависимость FetchContent не найдена во время процесса сборки

Сборка завершается ошибкой, так как зависимость выполнена через FetchContent недоступно во время процесса сборки.

include(FetchContent)

FetchContent_Declare(fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG master
)
FetchContent_MakeAvailable(fmt)
CMake Error at CMakeLists.txt:23 (target_link_libraries):
  Target "my_sample_lib" links to:

    fmt::fmt

  but the target was not found.  Possible reasons include:

    * There is a typo in the target name.
    * A find_package call is missing for an IMPORTED target.
    * An ALIAS target is missing.

vcpkg отключает FetchContent с помощью переменной FETCHCONTENT_FULLY_DISCONNECTEDCMake. Существует несколько мотивов для отключения этой функции, чтобы назвать несколько:

  • FetchContent может скрыть зависимости поставщиков от портов.
  • FetchContent не работает хорошо с полностью отключенными сценариями.
  • Зависимости, полученные с помощью FetchContent , могут изменять сборку без участия в вычислении хэша ABI.

Для поддержки портов рекомендуется, чтобы любой пакет, приобретенный через FetchContent , превратился в зависимость vcpkg. Но для общего использования существуют обходные пути для включения FetchContent.

Действия по устранению:

1. Использование VCPKG_CMAKE_CONFIGURE_OPTIONS Для задания FETCHCONTENT_FULLY_DISCONNECTED=FALSE

Зависимости, установленные vcpkg, не связаны во время сборки проекта

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

vcpkg предлагает автоматическую компоновку библиотек и включает каталоги для проектов CMake и MSBuild . Зависимости, установленные через vcpkg, должны быть доступны автоматически для использования в проекте.

Причина 1. Необходимые зависимости не установлены

Действия по устранению:

1. Убедитесь, что зависимости проекта готовы:

Если вы используете файл манифеста (vcpkg.json), убедитесь, что файл находится в том же каталоге, где содержится CMakeList.txt файл. Кроме того, убедитесь, что все зависимости перечислены в поле манифеста "dependencies" . vcpkg автоматически установит зависимости в манифесте при сборке проекта.

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

Причина 2. Интеграция для системы сборки не включена

CMake.

Действия по устранению:

1. Задайте CMAKE_TOOLCHAIN_FILE переменную цепочке инструментов vcpkg.

Необходимо CMAKE_TOOLCHAIN_FILE задать для указания на файл цепочки инструментов Vcpkg CMake, расположенный в {VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmakeпапке , обязательно замените {VCPKG_ROOT} правильный путь к каталогу установки vcpkg.

Для задания цепочки инструментов можно использовать любой из следующих методов:

  • CMakePresets.json Использование файла:
    • Если toolchainFile вы используете версию 3 или более позднюю.
    • Задайте значение CMAKE_TOOLCHAIN_FILE , если вы используете cacheVariable версию 2 или более раннюю версию.
  • Передача -DCMAKE_TOOLCHAIN_FILE={VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake аргумент командной строки во время вызова CMake.
  • Задайте CMAKE_TOOLCHAIN_FILE в CMakeList.txt файле. Убедитесь, что эта переменная задана перед любым вызовом project().

Если вы уже используете пользовательский файл цепочки инструментов с помощью CMAKE_TOOLCHAIN_FILE, установите VCPKG_CHAINLOAD_TOOLCHAIN_FILE с помощью настраиваемого триплета , чтобы указать на цепочку пользовательских инструментов.

MSBuild

vcpkg предоставляет глобальный механизм интеграции с помощью vcpkg integrate install команды.

Когда команда выполняется один раз, интеграция vcpkg становится включенной для всех проектов с помощью MSBuild, с режимом манифеста или классическим режимом.

Эта интеграция связана с экземпляром vcpkg, из которого была выполнена команда, поэтому если у вас несколько экземпляров vcpkg, в проектах доступны только версия средства и пакеты, установленные в этом конкретном экземпляре.

Ознакомьтесь с документацией по интеграции MSBuild, чтобы узнать, как включить интеграцию vcpkg для одного проекта или решения.

Действия по устранению:

1. Запуск vcpkg integrate install для экземпляра vcpkg, который требуется использовать

Запустите vcpkg integrate install , чтобы включить глобальную интеграцию с MSBuild. Это необходимо сделать только один раз, чтобы экземпляр vcpkg был включен для всех проектов.

Не удается установить пакеты с помощью классического режима

Выполнение команды завершается ошибкой vcpkg install со следующим сообщением:

error: Could not locate a manifest (vcpkg.json) above the current working directory.
This vcpkg distribution does not have a classic mode instance.

Причина 1. Использование встроенной копии vcpkg в Visual Studio

Visual Studio 2022 включает копию vcpkg, устанавливаемую с помощью рабочего процесса C++. Этот пакет vcpkg устанавливается в расположении только для чтения, и таким образом не может использоваться в классическом режиме.

Вы используете встроенный терминал Visual Studio или PowerShell для разработчика VS, который имеет копию упаковаемого vcpkg в своем PATH.

Действия по устранению:

1. Создайте файл манифеста (vcpkg.json) для установки зависимостей проекта. 2. Если у вас есть автономный экземпляр vcpkg, его можно использовать, задав VCPKG_ROOT переменную и добавив путь установки в PATH переменную.

$env:VCPKG_ROOT="path/to/standalone/vcpkg"
$env:PATH="$env:PATH;$env:VCPKG_ROOT"

Проблема не указана здесь

Если проблема не указана здесь, посетите наш репозиторий , чтобы создать новую проблему.