将数组传递给函数

时间:2016-12-16 09:50:20

标签: function cmake arguments

我想创建一个CMake函数,它将第一个参数作为列表,第二个参数作为单个名称。

function (my_function PROJECT_SRC DEPENDENCY_LIB)
  message (STATUS "Dependency lib is ${DEPENDENCY_LIB}")
endfunction()

当我使用它时,它不是我所期望的。如果我在列表前加上一些源文件,该函数将打印列表的第二个参数。

file (GLOB TEST_SRC *.cpp)
set (MY_DEPENDENCY "Something")
# It prints "Dependency lib is something/inside/TEST_SRC"
my_function(${TEST_SRC} ${MY_DEPENDENCY})

如何检索传递给函数的第二个参数?在将变量传递给CMake函数时,有没有办法区分列表和单个值?

2 个答案:

答案 0 :(得分:2)

首先......回到CMake的基础知识。什么是list? [1] [2]

它只是包含;个分隔值的字符串。所以,以下内容:

set(FOO "test")
list(LENGTH FOO FOO_LEN)
message(STATUS "List length:" ${FOO_LEN})

会产生1。

set(FOO "aaaaaa;bbbbbbbb")
list(LENGTH FOO FOO_LEN)
message(STATUS "List length:" ${FOO_LEN})

会产生2。

所以,回答第二个问题,你可以检查列表的长度,如果它等于1 ---它是一个包含单个值的“列表”,可以解释为基本字符串。

回答你的第一个问题---在你的例子中${TEST_SRC} ${MY_DEPENDENCY}被作为一个大的“列表”传递给该函数。所以,要将它们分成两个单独的参数,你应该

a)引用两个论点并由此分别传递它们

b)不要引用那些并在你的函数管理中使用传递的列表[3]

[1] https://cmake.org/cmake/help/v3.0/manual/cmake-language.7.html#lists

[2] https://cmake.org/cmake/help/v3.0/command/list.html

答案 1 :(得分:1)

我自己找到了解决方案。

我将list参数作为字符串传递:

my_function("${TEST_SRC}" ${MY_DEPENDENCY})