2016-12-16 163 views
2

我想創建一個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

請您太客氣了,接受的答案之一爲這個問題保持關閉? – Kamiccolo

回答

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}被作爲一個大的「列表」傳遞給函數。所以,把這些分開成兩個獨立的參數,你應該

一)引用的兩個參數,並通過該---分別通過他們

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

0

我自己找到了解決方案。

我通過列表參數作爲一個字符串:

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