查找没有“find_package”文档的 vcpkg 包

Nic*_*las 3 cmake visual-studio vcpkg

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

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

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

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

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

Nic*_*las 5

find_package查找通常随 vcpkg 软件包附带的特定类型的 .cmake 文件。这些 .cmake 文件执行设置要链接的包含目录和库的工作。

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

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

find_path(PANGO_INCLUDE_DIR pango/pango.h)
Run Code Online (Sandbox Code Playgroud)

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

target_include_directories(project_name_here PRIVATE ${PANGO_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

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

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

find_library(PANGO_LIBRARY pango-1.0)
find_library(PANGOCAIRO_LIBRARY pangocairo-1.0)
Run Code Online (Sandbox Code Playgroud)

然后您可以通过以下方式链接这些库target_link_libraries

target_link_libraries(cairo_vcpkg PRIVATE
    ...
    ${PANGO_LIBRARY}
    ${PANGOCAIRO_LIBRARY}
    )
Run Code Online (Sandbox Code Playgroud)