我想创建一个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函数时,有没有办法区分列表和单个值?
答案 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
答案 1 :(得分:1)
我自己找到了解决方案。
我将list参数作为字符串传递:
my_function("${TEST_SRC}" ${MY_DEPENDENCY})