SelectLibraryConfigurations

此模块提供了一个命令,用于在程序包提供多个 构建配置 可用时自动设置库变量。它 intended for use in 查找模块 实现 find_package(<PackageName>) 调用。

在 CMake 查找模块中加载此模块,使用

FindFoo.cmake
include(SelectLibraryConfigurations)

支持的构建配置是 ReleaseDebug,因为它们是这类程序包中最常见的配置。

注意

此模块自 CMake 的早期版本以来就可用,当时 <PackageName>_LIBRARIES 结果变量用于链接找到的程序包。编写标准查找模块时,应优先使用 导入目标。除了此模块或作为此模块的替代项,导入目标通过 IMPORTED_CONFIGURATIONS 属性提供了对链接的更精细控制。

命令

此模块提供以下命令

select_library_configurations

基于调试和发布构建配置设置和调整库变量

select_library_configurations(<basename>)

此命令是一个辅助命令,用于在库可能提供多个构建配置时设置 <basename>_LIBRARY<basename>_LIBRARIES 结果变量。

参数是

<basename>

库的基本名称,用作变量名的前缀。这是 Find<PackageName>.cmake 模块文件名中使用的程序包名称,或者在查找模块提供它们时的组件名称。

在调用此命令之前,应在查找模块中设置以下缓存变量(例如,由 find_library() 命令设置)

<basename>_LIBRARY_RELEASE

一个缓存变量,存储库 Release 构建的完整路径。如果未设置或未找到,此命令将其值设置为 <basename>_LIBRARY_RELEASE-NOTFOUND

<basename>_LIBRARY_DEBUG

一个缓存变量,存储库 Debug 构建的完整路径。如果未设置或未找到,此命令将其值设置为 <basename>_LIBRARY_DEBUG-NOTFOUND

此命令然后设置以下局部结果变量

<basename>_LIBRARY

一个结果变量,如果找到 <basename>_LIBRARY_RELEASE 变量,则设置为该变量的值;否则,如果找到 <basename>_LIBRARY_DEBUG 变量,则设置为该变量的值。如果两者都找到,则发布库值具有优先权。如果两者都未找到,则设置为值 <basename>_LIBRARY-NOTFOUND

如果使用的 CMake 生成器 支持构建配置,则此变量将是一个找到的库列表,每个库前面都带有 optimizeddebug 关键字,指定给定配置应链接哪个库。这些关键字由 target_link_libraries() 命令使用。如果未设置构建配置或使用的生成器不支持构建配置,则此变量值将不包含这些关键字。

<basename>_LIBRARIES

一个结果变量,设置为与 <basename>_LIBRARY 变量相同的值。

注意

select_library_configurations() 命令应在处理标准的查找模块参数和 find_package_handle_standard_args() 之前调用,以确保 <PackageName>_FOUND 结果变量基于 <basename>_LIBRARY 或其他相关变量正确设置。

示例

在查找模块文件中基于构建配置设置库变量

FindFoo.cmake
# Find release and debug build of the library
find_library(Foo_LIBRARY_RELEASE ...)
find_library(Foo_LIBRARY_DEBUG ...)

# Set Foo_LIBRARY and Foo_LIBRARIES result variables
include(SelectLibraryConfigurations)
select_library_configurations(Foo)

# Set Foo_FOUND variable and print result message.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
  Foo
  REQUIRED_VARS Foo_LIBRARY ...
)

当查找模块提供具有多个构建配置的组件时

FindFoo.cmake
include(SelectLibraryConfigurations)
foreach(component IN LISTS Foo_FIND_COMPONENTS)
  # ...
  select_library_configurations(Foo_${component})
  # ...
endforeach()

项目随后可以如下使用此查找模块

CMakeLists.txt
find_package(Foo)
target_link_libraries(project_target PRIVATE ${Foo_LIBRARIES})
# ...