如何在CMake中判断指定目标是否为别名目标?
解决CMake别名目标的检测问题
首先,CMake没有内置的ALIASES_TARGET判断指令,要识别别名目标,得通过获取目标的ALIASED_TARGET属性来实现。另外先处理你提到的含分号的无效目标,直接跳过即可。
修改后的函数代码如下:
function(my_fancy_function targetName dstDir) # 忽略含分号的无效命名目标 if("${targetName}" MATCHES ";") return() endif() if(TARGET ${targetName}) # 获取目标的ALIASED_TARGET属性,判断是否为别名目标 get_target_property(aliased_target ${targetName} ALIASED_TARGET) if(NOT aliased_target STREQUAL "aliased_target-NOTFOUND") message(STATUS "this is an aliases target, points to: ${aliased_target}") # 别名目标本身没有库类型,需要获取它指向的实际目标的类型 set(actual_target ${aliased_target}) else() message(STATUS "this is an ordinary target") set(actual_target ${targetName}) endif() # 检测实际目标的库类型,如果是共享库则复制到指定目录 get_target_property(target_type ${actual_target} TYPE) if(target_type STREQUAL "SHARED_LIBRARY") message(STATUS "Copying shared library ${actual_target} to ${dstDir}") # 这里添加复制逻辑,比如用add_custom_command等 add_custom_command(TARGET ${actual_target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${actual_target}> ${dstDir} ) endif() endif() endfunction()
关键说明:
- 过滤无效目标:通过
MATCHES ";"判断目标名称是否包含分号,直接返回跳过处理。 - 判断别名目标:使用
get_target_property获取ALIASED_TARGET属性,如果该属性不是NOTFOUND,说明当前目标是别名,它指向的真实目标就是aliased_target的值。 - 获取实际库类型:别名目标本身没有类型信息,必须拿到它指向的真实目标,再通过
TYPE属性判断是静态库(STATIC_LIBRARY)还是共享库(SHARED_LIBRARY)。 - 复制共享库:确认是共享库后,用
add_custom_command配合POST_BUILD事件实现复制操作,$<TARGET_FILE:${actual_target}>是CMake生成器表达式,会自动替换为目标文件的完整路径。
内容的提问来源于stack exchange,提问作者ChrisZZ
相关产品推荐
相关产品推荐

