我使用的是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
这不是传递值。我做错了什么以及我必须如何处理函数参数
答案 0 :(得分:1)
我发现cmake中的函数有固定数量的参数(比如c / c ++) 当我定义变量时,我必须将其值与$ {}一起传递给function.If变量有多个值,函数只获取一个参数,函数将获得最后一个值。如果我不通过引用传递变量($ {})函数将获得变量名称,如值。
为了解决我的问题,我定义了不能获得参数的宏
macro(checkSources)
foreach(SRC ${SourceList})
file(GLOB Sources ${SRC})
endforeach(SRC)
endmacro(checkSources)
如果在当前CMakeList.txt中定义变量“SourceList”和“Sources”,则此工作正常 我知道,用
检查来源是个更好的主意file(GLOB Sources ${SourceList})
但这是我测试cmake的例子。
答案 1 :(得分: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