CMake无法找到使用vcpkg安装的库。

28

我想在Windows的CMake项目中使用vcpkg,因为我需要boostxerces,这两个都是由这个软件包管理器处理的。

我有以下的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)

Boostxerces-c已经通过vcpkg安装。由于我使用的是Visual Studio Code,因此我在settings.json中设置了vcpkg变量:

  "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.

目前我已经使用vcpkg命令安装了xerces,但是boost目前没有安装,但我期望在执行cmake命令的时候,vcpkg会下载并构建所需的构建包。

我也尝试过命令行:

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

但结果却相同。

我做错了什么?如何才能成功使用vcpkg?

4个回答

21
  1. 您需要事先安装包(使用vcpkg install)。

    (然后,您可以将工具链指定为CMake选项:

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

但是,如果你已经指定了一个工具链,比如交叉编译时,这种方法将行不通。

  • 相反,应该将它"包含"起来以避免这个问题:

    在查找包之前,在项目的CMakeLists.txt中添加此行:

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

    执行此操作将设置各种 CMAKE_(SYSTEM_)?(PREFIX|LIBRARY|INCLUDE|FRAMEWORK)_PATH cmake 变量,以启用 find_*() cmake 函数的工作,但请注意这些路径包括 VCPKG_TARGET_TRIPLET。 - Donovan Baarda
    非常感谢!在经过数小时的调查之后,include("C:\Users\[...]\vcpkg.cmake")解决了我的问题。再次感谢! - undefined

    20

    理论上讲,这很简单(假设vcpkg已经像在github actions中一样安装在C:/vcpkg);

    1. Install your "foo" package with vcpkg install foo

    2. Make sure your CMakeLists.txt finds and uses the package with;

      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})                                     
      
    3. Run cmake with

      -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
      

    但是... 直到我在 vcpkg install 命令中添加了 --triplet x64-windows 才使它对我起作用。

    DCMAKE_TOOLCHAIN_FILE 设置各种 CMAKE_(SYSTEM_)?(PREFIX|LIBRARY|INCLUDE|FRAMEWORK)_PATH 变量以启用 find_*() cmake 函数的工作,但请注意这些路径包括 VCPKG_TARGET_TRIPLET。在我的情况下,使用 vcpkg install <foo> 安装包默认为 x86-windows,但是使用 -DCMAKE_TOOLCHAIN_FILE=C:/.... 调用 cmake 默认为 x64-windows,因此找不到该包。

    目前 vcpkg 默认为较旧的 x86 目标,但现代 Visual Studio(由 githup actions 使用)默认为 x64。解决方法是使用 vcpkg -triplet x64-windows install <foo> 安装包。我花了太长时间去走太多的兔子洞才发现这个问题。


    这是我的问题的解决方案。唯一需要提到的是它是 --triplet x64-windows,而不是 --triple x64-windows - Ivan Siutsou
    谢谢,我想我一段时间前已经纠正了这个问题(或接受了一个纠正),但忘记确认这个修正。 - Donovan Baarda
    根据vcpkg警告:自2023年9月发布以来,vcpkg库的默认三元组将从x86-windows更改为检测到的主机三元组。对于不想等待的任何人,请尝试设置VCPKG_DEFAULT_TRIPLET环境变量。 - kbridge4096
    你还可以使用vcpkg install foo:x64-windows命令安装64位的软件包。 - undefined

    8
    boost目前未安装,但我原本期望在执行cmake命令时,vcpkg将下载并构建必要的构建包。据我所知事实并非如此。您需要预先使用vcpkg为您计划使用的三元组(即x64-windows)安装所需的软件包。然后,在运行CMake时,您需要确保正在使用正确的三元组(检查CMakeCache.txt中的VCPKG_TARGET_TRIPLET变量)。如果不正确,您可以更改它并使用CMake重新配置。
    此外,根据您收到的错误输出,似乎也没有使用vcpkg正确安装xerces。您可以通过运行以下命令检查已安装的内容:
    vcpkg list --triplet x64-windows

    我正在使用 vcpkg install boost:x64-windows 进行安装。这需要一些时间。但我认为问题可能出在 xerces 上,因为所有库都可能存在相同的问题。 - Jepessen
    1
    对于 XercesC 库,从 find_package 调用中删除 CONFIG。如果您已使用 vcpkg 安装了该库,则 CMake 应该能够找到它。 - Developer Paul
    1
    我已经删除了CONFIG,即使xerces-c vcpkg包建议使用它,但仍然没有任何变化。 - Jepessen
    1
    在您的CMake缓存中删除所有XercesC变量并重新配置? - Developer Paul
    @Jepessen 我也遇到了与你的xerces库的CMake错误相同的问题。解决方案是什么?我已经检查了变量VCPKG_TARGET_TRIPLET。我的CMake没有检测到该库。vcpkg列表显示该软件包已安装。 - ywiyogo
    显示剩余2条评论

    2

    我曾经遇到过同样的问题,现在已经解决了,方法如下:

    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/")
    

    我在C:/Libs下安装了vcpkg。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接