SelectLibraryConfigurations

此模块旨在用于查找模块,并提供一个命令,以便在包具有多个构建配置时自动设置库变量。

在 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})
# ...