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

CMake调用CMAKE_CA65816_COMPILE_OBJECT时如何拆分<INCLUDES>重复-I参数

问题原因

自定义汇编语言编译规则时,<INCLUDES>内置变量的展开逻辑由对应语言的包含参数前缀配置决定。未给CA65816架构单独配置包含参数前缀时,CMake只会将所有包含目录以空格拼接,仅保留规则里手动写的第一个-I,最终生成不符合ca65参数规范的命令。

解决方法

方法1:原生配置(推荐)

CMake为每个编程语言预留了专门的包含参数前缀配置项,配置后<INCLUDES>会自动为每个包含目录添加指定前缀,无需手动拼接。
在设置编译规则前添加如下配置:

# 配置CA65816语言的包含目录参数前缀
set(CMAKE_INCLUDE_FLAG_CA65816 "-I")
# ca65不区分普通包含目录与系统包含目录,配置相同参数即可
set(CMAKE_INCLUDE_SYSTEM_FLAG_CA65816 "-I")

将原编译规则中的-I <INCLUDES>修改为直接引用<INCLUDES>,修改后完整配置:

set( CMAKE_CA65816_COMPILE_OBJECT "<CMAKE_CA65816_COMPILER> --cpu 65816 -s -o <OBJECT> <SOURCE> <INCLUDES>")

配置后生成的编译命令会自动在每个包含目录前添加独立的-I参数,完全符合ca65的参数要求。

方法2:生成器表达式拼接(兼容旧版CMake)

若使用的CMake版本较低,方法1不生效,可以直接通过生成器表达式读取目标包含目录属性,手动拼接参数,无需依赖<INCLUDES>变量。修改后的编译规则配置:

set(CMAKE_CA65816_COMPILE_OBJECT 
    "<CMAKE_CA65816_COMPILER> --cpu 65816 -s -o <OBJECT> <SOURCE> $<IF:$<BOOL:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>>,-I,>$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I >"
)

该写法通过$<JOIN>表达式将所有包含目录以-I为分隔符拼接,同时判断包含目录为空的场景,避免输出多余的空参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:15:38