Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cmake中传递空字符串?_Cmake - Fatal编程技术网

在cmake中传递空字符串?

在cmake中传递空字符串?,cmake,Cmake,我试图在cmake中重新定义一个函数。但是,此函数只有一些签名。如果我不认识签名,我只想用所有原始参数调用原始签名。除非函数os调用时使用空字符串(“”)作为参数,否则此操作正常。问题可以这样说明: function(y) list(LENGTH ARGN len) message("y got ${len} elements: ${ARGN}") endfunction() function(x) list(LENGTH ARGN len) message("x got ${

我试图在cmake中重新定义一个函数。但是,此函数只有一些签名。如果我不认识签名,我只想用所有原始参数调用原始签名。除非函数os调用时使用空字符串(
“”
)作为参数,否则此操作正常。问题可以这样说明:

function(y)
  list(LENGTH ARGN len)
  message("y got ${len} elements: ${ARGN}")
endfunction()

function(x)
  list(LENGTH ARGN len)
  message("x got ${len} elements: ${ARGN}")
  y(${ARGN})
endfunction()

x(a b "")
x(a "" c)
将上述内容保存到
x.cmake
并运行
cmake-p x.cmake
,打印

> cmake -P x.cmake
x got 3 elements: a;b;
y got 2 elements: a;b
x got 3 elements: a;;c
y got 2 elements: a;c
也就是说,
y
没有得到空字符串,我重新定义的函数停止工作。有没有关于如何传递所有参数(包括空字符串)的线索

真正的用例是尝试重新定义
文件
以更改安装。你的选择似乎不适用于此:

function(file)
  message("Calling file(${ARGN})")
  _file("${ARGN}")
endfunction()

include("cmake_install.cmake")
这导致

> cmake -P cmake_ln_install.cmake
-- Install configuration: "RelWithDebInfo"
Calling file(RPATH_CHECK;FILE;/home/janw/cmake/linux/lib/swipl/bin/x86_64-linux/swipl;RPATH;/home/janw/cmake/linux/lib/swipl/lib/x86_64-linux)
CMake Error at cmake_ln_install.cmake:3 (_file):
  _file must be called with at least two arguments.
Call Stack (most recent call first):
  src/cmake_install.cmake:43 (file)
  cmake_install.cmake:42 (include)
  cmake_ln_install.cmake:6 (include)
改变

y(${ARGN})


使其按预期运行。

Hm,在我知道的CMake函数中,空字符串(
“”
)仅作为位置参数接受,因此您可以将函数定义为
函数(x param1 param2 param3)
,并直接访问这些参数。异常是一个类似于
set
的函数,您不太可能想要截取它。它看起来很有说服力,但不起作用。我试图重新定义的真正函数是
file
。我编辑了上面的问题,以反映什么不起作用是的,这不应该起作用。被调用方将在引号内传递的内容视为单个参数。但是,如果被调用方本身将迭代
${ARGN}
,它将查找所有参数,就好像它们是单独传递的一样@JanWielemaker:您可以尝试定义
函数(文件arg1 arg2)
并使用
\u文件(${arg1}${arg2}“${ARGN}”)
调用原始函数。这应该通过对参数编号的检查。我考虑过了,但是我们得到了这个(很抱歉格式不好)
--安装配置:“RelWithDebInfo”调用文件(RPATH\u check file/ufs/wielemak/lib/swipl/bin/x86\u 64-linux/swipl;RPATH;/ufs/wielemak/lib/swipl/lib/x86\u 64-linux)CMake\u安装时出错。CMake:3(\u文件):_filerpath_CHECK未提供RPATH选项。调用堆栈(最新调用优先):src/cmake_install.cmake:43(文件)cmake_install.cmake:42(包括)cmake_ln_install.cmake:6(包括)'(有人知道在哪里找到S/OSCOD>文件的SULRE吗?这可能暗示了发生了什么。下载了源代码。<代码>文件<代码>命令是用C++编写的,而且似乎处理附加的参数在那里是不同的。这可能解释了为什么<代码>文件(${ARG1}${ARG2} ${ARGN})。
不起作用。回到原点:如果列表中可能包含空字符串,如何从函数名和参数调用函数?
y("${ARGN}")