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

如何基于CMake现有目标创建继承其属性的关联派生目标

CMake 原生没有你举例的add_derived_executable这类派生可执行目标的专用接口,不过可以通过以下两种方案实现需求,无需重复编写原有配置:

方案1:抽离公共配置为OBJECT库(推荐,可维护性最高)

把原有ABC目标的所有公共配置、源码都封装到OBJECT类型的中间目标中,原有ABC目标和新的派生目标都基于这个中间目标构建,所有公共配置只需要写一次:

# 定义公共OBJECT目标,存放所有公共源码、配置、依赖
add_library(ABC-common OBJECT abc.cpp)
# 原属于ABC的所有编译选项、头文件目录、链接依赖、链接选项都挪到该OBJECT目标上
target_compile_options(ABC-common PUBLIC <原有编译参数>)
target_include_directories(ABC-common PUBLIC <原有头文件路径>)
target_link_libraries(ABC-common PUBLIC <原有依赖库>)

# 原ABC目标直接复用OBJECT目标的编译结果和配置
add_executable(ABC $<TARGET_OBJECTS:ABC-common>)
target_link_libraries(ABC PUBLIC ABC-common)

# 派生目标ABC-extended同样复用所有公共配置,仅需新增额外参数
add_executable(ABC-extended $<TARGET_OBJECTS:ABC-common>)
target_link_libraries(ABC-extended PUBLIC ABC-common)
target_compile_options(ABC-extended PUBLIC -O3)

方案2:不修改原有ABC目标定义,通过生成器表达式复制属性

如果不想改动已经写好的ABC目标相关代码,可以用CMake生成器表达式自动复制ABC的所有属性到新目标:

# 定义INTERFACE中间库承接ABC的所有属性
add_library(ABC-properties INTERFACE)
target_compile_options(ABC-properties INTERFACE $<TARGET_PROPERTY:ABC,COMPILE_OPTIONS>)
target_include_directories(ABC-properties INTERFACE $<TARGET_PROPERTY:ABC,INCLUDE_DIRECTORIES>)
target_link_libraries(ABC-properties INTERFACE $<TARGET_PROPERTY:ABC,LINK_LIBRARIES>)
target_link_options(ABC-properties INTERFACE $<TARGET_PROPERTY:ABC,LINK_OPTIONS>)

# 定义派生目标,复用相同源码,链接中间库继承所有配置
add_executable(ABC-extended abc.cpp)
target_link_libraries(ABC-extended PRIVATE ABC-properties)
# 添加额外编译参数
target_compile_options(ABC-extended PRIVATE -O3)

注意该方案需要确认你使用的CMake版本支持对应目标属性的生成器表达式读取,大部分场景下CMake 3.13及以上版本都可以正常运行。

内容的提问来源于stack exchange,提问作者Ranza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:27:03