SelectLibraryConfigurations¶
此模块旨在用于查找模块,并提供一个命令,以便在包具有多个构建配置时自动设置库变量。
在 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})
# ...