LINK_LIBRARIES_ONLY_TARGETS¶
在版本 3.23 中添加。
强制要求,可以将链接项视为目标名称时,它们必须是实际存在的目标。
将此属性设置为 true 值,可以对 LINK_LIBRARIES 和 INTERFACE_LINK_LIBRARIES 目标属性的内容进行额外的检查,这些属性通常由 target_link_libraries() 填充。检查也会应用于通过其依赖项的 INTERFACE_LINK_LIBRARIES_DIRECT 属性添加到目标的库。CMake 将验证可能被视为目标名称的链接项是否确实指向存在的目标。如果满足以下条件,则一个项被视为可能的名称:
它不包含
/或\,并且它不以
-开头,并且(出于历史原因) 它不以
$或`开头。
当创建非导入目标时,此属性由 CMAKE_LINK_LIBRARIES_ONLY_TARGETS 变量的值初始化。可以通过显式启用此属性来检查导入目标的链接接口。
在下面的示例中,CMake 将在配置时因 miLib 不是目标而发生错误。
set(CMAKE_LINK_LIBRARIES_ONLY_TARGETS ON)
add_library(myLib STATIC myLib.c)
add_executable(myExe myExe.c)
target_link_libraries(myExe PRIVATE miLib) # typo for myLib
为了通过名称链接工具链提供的库,同时仍然强制执行 LINK_LIBRARIES_ONLY_TARGETS,请使用具有 IMPORTED_LIBNAME 目标属性的 导入 接口库。
add_library(toolchain::m INTERFACE IMPORTED)
set_property(TARGET toolchain::m PROPERTY IMPORTED_LIBNAME "m")
target_link_libraries(myExe PRIVATE toolchain::m)
另请参阅策略 CMP0028。
注意
如果 INTERFACE_LINK_LIBRARIES 包含生成器表达式,其实际链接项列表可能取决于使用者目标的类型和属性。在这种情况下,CMake 可能无法始终检测到仅针对特定使用者出现的缺失目标的名称。未来版本的 CMake 将通过改进的启发式方法,可能会开始触发先前版本 CMake 接受的项目中的错误。