Я хочу использовать 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?





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
@Jepessen хорошо, как насчет ускорения?
Я устанавливаю их прямо сейчас с помощью vcpkg install boost:x64-windows. Это займет некоторое время. Но я думаю, что проблема с xerces, так как она может быть одинаковой для всех библиотек.
Для XercesC удалите CONFIG из звонка find_package. CMake должен найти библиотеку, если вы установили ее с помощью vcpkg.
Я удалил CONFIG, даже если это было предложено пакетом xerces-c vcpkg, но ничего не изменилось.
Удалить все переменные XercesC в кеше CMake и заново настроить?
@Jepessen У меня такая же проблема с ошибкой CMake вашей библиотеки xerces. Каково было решение? Я уже проверил переменную VCPKG_TARGET_TRIPLET. Мой CMake не обнаруживает файл lib. Список vcpkg показывает, что пакет установлен.
У меня была такая же проблема, и я просто решил ее либо с помощью:
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:/библиотеки
(Тогда вы можете указать цепочку инструментов в качестве параметра CMake:
-DCMAKE_TOOLCHAIN_FILE=C:\path\to\vcpkg\scripts\buildsystems\vcpkg.cmake
но это не сработает, если вы уже указали цепочку инструментов, например, при кросс-компиляции.)
Добавьте эту строку в проект 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.
Теоретически это так же просто (при условии, что vcpkg установлен в C:/vcpkg, как и для действий github);
vcpkg install foofind_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})
-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.
Я выполнил команду, и кажется, что 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