LINK_LIBRARIES_ONLY_TARGETS¶
在 3.23 版本加入.
强制可以是目标名称的链接项实际上是现有目标。
将此属性设置为真值以启用对 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 Interface Library 和 :prop_tgt:`IMPORTED_LIBNAME`目标属性:
add_library(toolchain::m INTERFACE IMPORTED)
set_property(TARGET toolchain::m PROPERTY IMPORTED_LIBNAME "m")
target_link_libraries(myExe PRIVATE toolchain::m)
另请参阅政策:policy:CMP0028。
备注
如果 INTERFACE_LINK_LIBRARIES 包含生成器表达式,它的实际链接项列表可能取决于使用目标的类型和属性。在这种情况下,CMake 可能不会总是检测到仅针对特定消费者出现的缺失目标的名称。具有改进的启发式方法的未来版本的 CMake 可能会开始触发以前版本的 CMake 接受的项目的错误。