You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:15:05