1

我使用 cmake 2.8.8。我想让函数获取源文件列表检查它们是否存在并将存在的文件放在另一个我必须在我的 CMakeList.txt 中使用的变量中。这是我的函数

function(SetSources SourceList Sourceses )

message(STATUS "Sourcelist " ${SourceList})

foreach(SRC ${SourceList})

FILE(GLOB Sourceses ${SRC})

message(STATUS "Sources " ${Sourceses})

endforeach(SRC)

endfunction(SetSources)

这是我所说的函数以及我向其推送的参数

set(SourceList plugincustomresourcemgr.cpp PluginCustomResourceDLL.cppextendedarchive.cpp)

set(Sourceses)

SetSources(SourceList Sourceses)

输出形式

message(STATUS "Sourcelist " ${SourceList})

--SourceList SourceList

这不是传递值。我做错了什么以及我必须如何处理函数参数

4

2 回答 2

2

我发现 cmake 中的函数具有固定数量的参数(如 c/c++)当我定义变量时,我必须将他的值与 ${} 传递给函数。如果变量有多个值并且函数只有一个参数,函数将获取最后一个值。如果我不通过引用传递变量(${})函数将获得变量的名称,如值。

为了解决我的问题,我定义了没有参数的宏

macro(checkSources)

foreach(SRC ${SourceList})

file(GLOB Sources ${SRC})

endforeach(SRC)

endmacro(checkSources)

如果我知道在当前 CMakeList.txt 中定义了变量“SourceList”和“Sources”,则此工作正常,使用

file(GLOB Sources ${SourceList})

但这是我测试cmake的例子。

于 2012-07-25T11:42:31.093 回答
0

一个简单的解决方案是使用 ARGV 和 ARGC 相互配合。它们的含义就像C/C++中main的argv和argc,分别代表参数个数和参数个数。例如:

function(showSrcList srcList)
message("ARGC = "${ARGC})
message("ARGV = "${ARGV})

set(i 0)
while(i LESS ${ARGC})
    message("ARG = "${ARGV${i}}) #ARGV0、ARGV1...
    math(EXPR i "${i} + 1")
endwhile()
endfunction()
showSrcList (a.c b.c c.c d.c)

==== output ====
ARGC = 4
ARGV = a.c b.c c.c d.c
ARG = a.c
ARG = b.c
ARG = c.c
ARG = d.c 
于 2019-09-27T08:45:41.360 回答