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

CMake中如何向自定义函数传递完整的多列表参数

CMake函数传递完整列表的问题

问题重现

我尝试将完整的列表传递给CMake函数,但目前只能获取到列表的第一个元素。

我的代码

cmake_minimum_required(VERSION 3.29)

function(my_function)
    cmake_parse_arguments(MY_FUNCTION "" "LIST1;LIST2" "" ${ARGN})

    message("List 1: ${MY_FUNCTION_LIST1}")
    message("List 2: ${MY_FUNCTION_LIST2}")

    # 也可以不解析直接遍历列表
    foreach(item IN LISTS MY_FUNCTION_LIST1)
        message("Item in List 1: ${item}")
    endforeach()

    foreach(item IN LISTS MY_FUNCTION_LIST2)
        message("Item in List 2: ${item}")
    endforeach()
endfunction()

set(my_list1 "item1;item2;item3")
set(my_list2 "itemA;itemB;itemC")

my_function(LIST1 "${my_list1}" LIST2 "${my_list2}")

当前输出

List 1: item1
List 2: itemA
Item in List 1: item1
Item in List 2: itemA

我希望传递完整的my_list1和my_list2给函数,请问该怎么处理?

解决方案

问题出在调用函数时给列表变量加了双引号——这会把整个列表转换成单个字符串,CMake解析时只会取第一个分号前的内容作为参数值。

只需要去掉调用时的双引号,直接传递列表变量即可:

修改后的调用代码

my_function(LIST1 ${my_list1} LIST2 ${my_list2})

原理说明

CMake中列表是以分号分隔的字符串序列,不加引号传递变量时,CMake会把列表的每个元素作为独立参数传递,而cmake_parse_arguments会自动将对应关键字后的所有连续参数合并成列表,正好匹配我们传递完整列表的需求。

修改后预期输出

List 1: item1;item2;item3
List 2: itemA;itemB;itemC
Item in List 1: item1
Item in List 1: item2
Item in List 1: item3
Item in List 2: itemA
Item in List 2: itemB
Item in List 2: itemC

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:43:12