CMake技术疑问:为何无法从INTERFACE目标读取INCLUDE_DIRECTORIES?
问题原因与解决方法
为什么属性读取失败?
1. INTERFACE库不具备INCLUDE_DIRECTORIES属性
你创建的version是INTERFACE类型库,这类库仅用于传递编译接口(比如头文件路径、编译选项等),本身没有可编译的代码,也不存在自身的包含目录。INCLUDE_DIRECTORIES属性是为有实体的库(STATIC/SHARED/OBJECT)设计的,用来指定库自身编译时的头文件路径,所以对INTERFACE库读取这个属性必然返回NOTFOUND。
2. get_cmake_property不能用于读取目标属性
get_cmake_property的作用是读取CMake全局属性(比如CMAKE_MODULE_PATH这类),而非目标的属性。要读取目标的属性,必须使用get_target_property——这就是你前三个读取操作失败的核心原因。只有最后一个用get_target_property读取INTERFACE_INCLUDE_DIRECTORIES的操作是正确的,所以能拿到正确路径。
用生成器表达式读取目录的正确方式
如果要通过生成器表达式获取该目录,直接使用目标属性的生成器表达式语法即可,无需提前用get_target_property获取:
# 示例:在其他目标中使用生成器表达式引用该目录 add_executable(my_app main.cpp) target_include_directories(my_app PRIVATE $<TARGET_PROPERTY:version,INTERFACE_INCLUDE_DIRECTORIES> )
或者更简洁的方式:直接通过target_link_libraries让目标继承INTERFACE库的接口属性,无需手动引用路径:
add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE version)
内容的提问来源于stack exchange,提问作者Adam Ryczkowski
相关产品推荐
相关产品推荐

