SelectLibraryConfigurations¶
此模块提供了一个命令,用于在程序包提供多个 构建配置 可用时自动设置库变量。它 intended for use in 查找模块 实现 find_package(<PackageName>) 调用。
在 CMake 查找模块中加载此模块,使用
FindFoo.cmake¶include(SelectLibraryConfigurations)
支持的构建配置是 Release 和 Debug,因为它们是这类程序包中最常见的配置。
注意
此模块自 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 生成器支持构建配置,则此变量将是一个找到的库列表,每个库前面都带有optimized或debug关键字,指定给定配置应链接哪个库。这些关键字由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})
# ...