CMake重写add_library()后调用find_package报错如何解决?
问题原因
你的add_library重写实现存在两个核心错误:
- 变量大小写错误导致参数丢失:CMake内置的函数剩余参数变量是大小写敏感的
ARGN,你写的argn是未定义的空值,调用原生_add_library时除了target名之外的所有参数都被丢弃。find_package引入的第三方依赖(比如Qt的Qt5::qdbusxml2cpp)都是通过带IMPORTED标记的add_library声明的导入目标,参数丢失后原生函数不会生成对应的目标,后续set_target_properties调用自然找不到目标抛出错误。 - 没有做目标类型过滤:你全局覆盖了
add_library函数,所有CMake脚本包括第三方依赖的配置脚本里的add_library调用都会走你的自定义逻辑,而第三方的导入/别名目标不需要你的后置处理,也不属于你要处理的项目内库范畴。
修复方案
方案1:完善重写逻辑
function(add_library target) # 传递所有参数调用原生add_library _add_library(${target} ${ARGN}) # 过滤非项目内的目标,跳过后置处理 get_target_property(is_imported ${target} IMPORTED) get_target_property(is_alias ${target} ALIASED_TARGET) if(is_imported OR is_alias) return() endif() # 你的后置处理逻辑 message("################# PROCESSING LISTDIR" ${CMAKE_CURRENT_LIST_FILE} ":" ${CMAKE_CURRENT_LIST_LINE}) endfunction()
方案2:避免全局覆盖(更稳妥)
不要直接重写原生add_library,自定义一个项目专属的库声明函数,比如add_project_library,你的业务代码里的库统一用这个函数声明,完全不会影响第三方依赖的逻辑。
内容的提问来源于stack exchange,提问作者danba
相关产品推荐
相关产品推荐

