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
相关产品推荐
相关产品推荐

