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_LIBNAME
目标属性的 imported Interface Library
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 接受的项目上触发错误。