【问题标题】:Finding vcpkg packages that don't have `find_package` documentation查找没有 `find_package` 文档的 vcpkg 软件包
【发布时间】:2021-07-01 12:47:24
【问题描述】:

当您通过 vcpkg 安装许多软件包时(例如 vcpkg install cairo),在此过程结束时,您会被告知使用哪些 find_packagetarget_link_libraries CMake 命令来链接到已安装的软件包.这很好用;您甚至可以重新执行 install 命令再次查看这些 CMake 命令。

但是,通过 vcpkg 安装的某些软件包没有这些。例如,在安装 Pango 之后,没有实际使用该库的 CMake 命令列表。我在几个 vcpkg 包目录中找到了find_package 的目标 CMake 文件,但 Pango 目录没有该包的 CMake 文件。

由于某种原因,使用 Pango 的示例代码仍然可以编译(即:它可以找到 Pango 的头文件),但由于未链接到正确的库而无法链接。

那么这应该如何工作?我是否必须通过 Pango 的各种 CMake 接口列出包含目录、库目录和库文件?或者是否有一些替代的包含机制可以像大多数其他 vcpkg 包一样处理细节?

请注意,我正在使用 Visual Studio 2019 的内置 CMake 功能来尝试使用这些功能进行构建。

【问题讨论】:

  • 看起来他们准备 CMakeLists.txt 作为 vcpkg Pango 端口的一部分。由于此CMakeLists.txt 不导出目标,因此您不能直接将此包包含在find_package 中。不确定他们对在 CMake 代码中使用这个包的期望。可能,他们希望您(从某处)下载脚本FindPango.cmake,因此您可以使用find_package(Pango)
  • @Tsyvarev,这不是解决方案,您只需要手动链接
  • @RashidLadjouzi:为什么使用脚本FindXXX.cmake 不是解决方案?此类脚本通常执行 find_pathfind_library - 您在答案代码中使用的相同命令。 “查找”脚本的一个优点是它知道所有可能的库名称、库和标题的所有(相对)位置。一些这样的脚本也知道依赖库。一些这样的脚本能够提取包的版本。为什么更喜欢手动编写脚本而不是使用现有的脚本?

标签: visual-studio cmake vcpkg


【解决方案1】:

确实,通过 vcpkg 安装的某些软件包不会导出 .cmake 文件,例如对你来说 Pango 和对我来说 SDL。 我想澄清一下,我已经尝试使用 vcpkg 两天了,我与您分享我在我身边使用的 cmakelist.txt,以便 SDL 像我使用 find_package 一样工作(需要 SDL)

cmake_minimum_required(VERSION 3.16)
project(xxxx)

### Specify the C++ standard ###

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake)

### To find and use SDL ###

# find path of include and lib
find_path(SDL_INCLUDE_DIR SDL/SDL.h)
find_library(SDL_LIBRARY SDL)

# find pat of manual-link library
set (LIBRARIES_TO_LINK C:/dev/vcpkg/installed:/x64-windows/lib/manual-link)
find_library(SDL1_TEST SDLmain HINTS ${LIBRARIES_TO_LINK})

....

【讨论】:

  • 我真的不明白这应该完成什么。 SDL_INCLUDE_DIR 是什么?您的其余代码都没有使用它。 SDL/SDL.h 应该是一个标题,我应该替换 Pango 的一个标题吗?
【解决方案2】:

find_package 查找通常随 vcpkg 软件包一起提供的特定类型的 .cmake 文件。这些 .cmake 文件负责设置要链接的包含目录和库。

因此,如果 vcpkg 软件包不包含这样的文件,您将需要基本上完成该文件会完成的工作。幸运的是,CMake 和 vcpkg 知道各种配置的头文件和库构建文件的位置。您需要做的是找到这些目录和库,然后将它们添加到您的项目中(以及包所需的任何其他特殊编译器选项,这需要对包有一定了解)。

要查找包含库头文件的包含目录,请使用find_path 设置一个变量,为其指定要搜索的头文件的名称。例如:

find_path(PANGO_INCLUDE_DIR pango/pango.h)

然后可以将此头目录设置为包含路径的一部分:

target_include_directories(project_name_here PRIVATE ${PANGO_INCLUDE_DIR})

库有点困难,因为您必须找到实际库的全名(减去扩展名)。如果包涉及多个库,您需要跟踪所有适用于您的库。

给定一个或多个感兴趣的库的名称,您可以使用 find_library 一次找到它们,并将这些库设置为变量:

find_library(PANGO_LIBRARY pango-1.0)
find_library(PANGOCAIRO_LIBRARY pangocairo-1.0)

然后您可以通过target_link_libraries 链接这些库:

target_link_libraries(cairo_vcpkg PRIVATE
    ...
    ${PANGO_LIBRARY}
    ${PANGOCAIRO_LIBRARY}
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多