Cmake не может найти библиотеки, установленные с vcpkg

Я хочу использовать vcpkg в проекте CMake в Windows, потому что мне нужны boost и xerces, которые обрабатываются этим менеджером пакетов.

У меня есть следующее CMakeLists.txt:

cmake_minimum_required (VERSION 3.12.0)

project (myproj)

set (CMAKE_PREFIX_PATH ${XERCES_ROOT})
set (Boost_USE_STATIC_LIBS ON)
set (Boost_USE_MULTITHREADED ON)
unset (Boost_INCLUDE_DIR CACHE)
unset (Boost_LIBRARY_DIRS CACHE)

# set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/modules)
find_package (Boost COMPONENTS filesystem regex REQUIRED)
find_package (XercesC CONFIG REQUIRED)

set (CMAKE_INCLUDE_CURRENT_DIR ON)
message (STATUS "binary dir is ${CMAKE_BINARY_DIR}")
include_directories (${CMAKE_BINARY_DIR}/${PROJECT_NAME}/)
include_directories (${CMAKE_CURRENT_SOURCE_DIR}/..)
include_directories (${Boost_INCLUDE_DIRS})
include_directories (${XercesC_INCLUDE_DIRS})

set (PROJECT_SRC
  code.cpp
  )

add_library (${PROJECT_NAME} SHARED ${PROJECT_SRC})
add_dependencies (${PROJECT_NAME} UPDATE_RESOURCES)
target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES} XercesC::XercesC)

Boost и xerces-c устанавливаются вместе с vcpkg. Поскольку я использую Visual Studio Code, я устанавливаю переменные vcpkg в settings.json:

  "cmake.configureSettings": {
    "CMAKE_TOOLCHAIN_FILE" : "some/path/vcpkg/scripts/buildsystems/vcpkg.cmake",
    "VCPKG_TARGET_TRIPLET": "x64-windows"
  }

Когда я запускаю CMake, я получаю следующие ошибки:

[cmake] CMake Error at C:/Program Files/CMake/share/cmake-3.14/Modules/FindBoost.cmake:2132 (message):
[cmake]   Unable to find the requested Boost libraries.
[cmake] 
[cmake]   Unable to find the Boost header files.  Please set BOOST_ROOT to the root
[cmake]   directory containing Boost or BOOST_INCLUDEDIR to the directory containing
[cmake]   Boost's headers.
[cmake] Call Stack (most recent call first):
[cmake]   D:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake:233 (_find_package)
[cmake]   src/myroject/CMakeLists.txt:24 (find_package)
[cmake] 
[cmake] 
[cmake] CMake Error at D:/Projects/vcpkg/installed/x64-windows/share/xercesc/vcpkg-cmake-wrapper.cmake:1 (_find_package):
[cmake]   Could not find a package configuration file provided by "XercesC" with any
[cmake]   of the following names:
[cmake] 
[cmake]     XercesCConfig.cmake
[cmake]     xercesc-config.cmake
[cmake] 
[cmake]   Add the installation prefix of "XercesC" to CMAKE_PREFIX_PATH or set
[cmake]   "XercesC_DIR" to a directory containing one of the above files.  If
[cmake]   "XercesC" provides a separate development package or SDK, be sure it has
[cmake]   been installed.
[cmake] Call Stack (most recent call first):
[cmake]   D:/Projects/vcpkg/scripts/buildsystems/vcpkg.cmake:189 (include)
[cmake]   src/ZLA/CMakeLists.txt:25 (find_package)
[cmake] 
[cmake] 
[cmake] Configuring incomplete, errors occurred!
[cmake] See also "D:/Projects/zla/build/vscode/CMakeFiles/CMakeOutput.log".
[cms-driver] Error during CMake configure: [cmake-server] Configuration failed.

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

Я также пробовал командную строку:

 cmake -DCMAKE_TOOLCHAIN_FILE=D:/Projects/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows ../

но результат тот же.

Что я делаю неправильно? Как я могу успешно использовать vcpkg?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
18 486
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

boost is currently not installed, but I was expecting that during the execution of the cmake command, vcpkg will download and build needed build packages.

Насколько мне известно, это не так. Вам необходимо заранее установить нужные пакеты с vcpkg для триплета, который вы планируете использовать (например, x64-windows). Затем вам нужно будет убедиться, что при запуске CMake используется правильный триплет (проверьте переменную VCPKG_TARGET_TRIPLET в CMakeCache.txt). Если он неверен, вы можете изменить его и перенастроить с помощью CMake.

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

vcpkg list --triplet x64-windows

Я выполнил команду, и кажется, что xerces установлен: xerces-c:x64-windows 3.2.2-8 Xerces-C++ is a XML parser, for parsing, generat…. А в CMakeCache.txt у меня правильная тройка: VCPKG_TARGET_TRIPLET:STRING=x64-windows

Jepessen 03.04.2019 15:58

@Jepessen хорошо, как насчет ускорения?

Developer Paul 03.04.2019 16:00

Я устанавливаю их прямо сейчас с помощью vcpkg install boost:x64-windows. Это займет некоторое время. Но я думаю, что проблема с xerces, так как она может быть одинаковой для всех библиотек.

Jepessen 03.04.2019 16:02

Для XercesC удалите CONFIG из звонка find_package. CMake должен найти библиотеку, если вы установили ее с помощью vcpkg.

Developer Paul 03.04.2019 18:17

Я удалил CONFIG, даже если это было предложено пакетом xerces-c vcpkg, но ничего не изменилось.

Jepessen 04.04.2019 09:26

Удалить все переменные XercesC в кеше CMake и заново настроить?

Developer Paul 04.04.2019 14:59

@Jepessen У меня такая же проблема с ошибкой CMake вашей библиотеки xerces. Каково было решение? Я уже проверил переменную VCPKG_TARGET_TRIPLET. Мой CMake не обнаруживает файл lib. Список vcpkg показывает, что пакет установлен.

ywiyogo 25.05.2020 23:33

У меня была такая же проблема, и я просто решил ее либо с помощью:

set(CURL_DIR "C:/Libs/vcpkg/installed/x64-windows/share/curl")

или

list(APPEND CMAKE_PREFIX_PATH "C:/Libs/vcpkg/packages/curl_x64-windows/share/curl/")

Я установил vcpkg под C:/библиотеки

  1. Вам необходимо заранее установить пакеты (используя vcpkg install ).

(Тогда вы можете указать цепочку инструментов в качестве параметра CMake:

-DCMAKE_TOOLCHAIN_FILE=C:\path\to\vcpkg\scripts\buildsystems\vcpkg.cmake

но это не сработает, если вы уже указали цепочку инструментов, например, при кросс-компиляции.)

  1. Вместо этого «включите» его, чтобы избежать этой проблемы:

Добавьте эту строку в проект CMakeLists.txt перед find_package():

include(/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake)

При этом устанавливаются различные переменные cmake CMAKE_(SYSTEM_)?(PREFIX|LIBRARY|INCLUDE|FRAMEWORK)_PATH, чтобы обеспечить работу функций cmake find_*(), но обратите внимание, что эти пути включают VCPKG_TARGET_TRIPLET.

Donovan Baarda 07.08.2021 02:41

Теоретически это так же просто (при условии, что vcpkg установлен в C:/vcpkg, как и для действий github);

  1. Установите свой пакет «foo» с помощью vcpkg install foo
  2. Убедитесь, что ваш CMakeLists.txt находит и использует пакет с;
find_package(FOO)
# Use these instead of the package doesn't have proper cmake package support.
# find_path(FOO_INCLUDE_DIRS foo.h)
# find_library(FOO_LIBRARYS foo)
include_directories(${FOO_INCLUDE_DIRS})
target_link_libraries(myprogram ${FOO_LIBRARIES})                                     
  1. Запустите cmake с помощью -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake

Но... у меня это не сработало, пока я не добавил --triplet x64-windows к команде vcpkg install.

DCMAKE_TOOLCHAIN_FILE устанавливает различные переменные CMAKE_(SYSTEM_)?(PREFIX|LIBRARY|INCLUDE|FRAMEWORK)_PATH, чтобы обеспечить работу функций cmake find_*(), но обратите внимание, что эти пути включают VCPKG_TARGET_TRIPLET. В моем случае установка пакета с vcpkg install <foo> по умолчанию была x86-windows, но затем вызов cmake с -DCMAKE_TOOLCHAIN_FILE=C:/.... по умолчанию был x64-windows, поэтому он не смог найти пакет.

В настоящее время vcpkg по умолчанию использует старую цель x86, но современная Visual Studio (используемая действиями gitup) по умолчанию использует x64. Исправление заключалось в установке пакета с помощью vcpkg -triplet x64-windows install <foo>. Мне потребовалось слишком много времени, чтобы обнаружить это.

Это решение моей проблемы. Единственное, что нужно упомянуть, это то, что это --triplet x64-windows, а не --triple x64-windows.

Ivan Siutsou 26.11.2021 15:18

Другие вопросы по теме