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中创建了一个函数,该函数应该接收两个参数,一个是字符串,另一个是源文件列表。问题是CMake截断了传递给函数的变量列表,我只得到第一个文件: set( INCLUDES ${PROJECT_SOURCE_DIR}/include/smthcore/Interface.hpp ) set( SRC ${PROJECT_SOURCE_DIR}/src/Interface.cpp ${PROJECT_SOURCE_DIR}/src/detail/Clas

我在CMake中创建了一个函数,该函数应该接收两个参数,一个是字符串,另一个是源文件列表。问题是CMake截断了传递给函数的变量列表,我只得到第一个文件:

set(
  INCLUDES
    ${PROJECT_SOURCE_DIR}/include/smthcore/Interface.hpp
)

set(
  SRC
    ${PROJECT_SOURCE_DIR}/src/Interface.cpp
    ${PROJECT_SOURCE_DIR}/src/detail/Class.hpp
    ${PROJECT_SOURCE_DIR}/src/detail/Class.cpp
)

set(
  TO_FORMAT
    ${INCLUDES} 
    ${SRC}
)

message("111 " ${TO_FORMAT})
include(ClangFormat)
format_source(src ${TO_FORMAT})
其中
消息
打印

/mnt/c/Users/Desktop/smth.Core/include/smthcore/Interface.hpp/mnt/c/Users/Desktop/smth.Core/src/Interface.cpp/mnt/c/Users/Desktop/smth.Core/src/detail/Class.hpp/mnt/c/Users/Desktop/smth.Core/src/detail/Class.cpp
但是在
format\u source
里面我有

function(FORMAT_SOURCE trgt to_format)
message("222 " ${trgt})
message("333 " ${to_format})
endfunction(FORMAT_SOURCE trgt to_format)
和333张照片

333 /mnt/c/Users/Desktop/smth.Core/include/smthcore/Interface.hpp

我很困惑。帮助?

编写CMake脚本时要记住的重要一点是,在文本CMake输入中,空格和
是有效的参数分隔符(1)。换句话说,您不是用2个参数调用函数,而是用5个参数调用函数(列表中的每个元素
TO_FORMAT
成为
FORMAT_source
的单独参数)

有多种方法可以解决这个问题。最小的一个是引用
到_格式的扩展,将其转换为单个参数,如下所示:

format_source(src "${TO_FORMAT}")
message("111 " ${TO_FORMAT})
message("111 " "${TO_FORMAT}")
但是,这很容易出错,并且与大多数本机CMake命令使用的样式并不匹配。因此,我建议采用另一种方法,使
format\u source
接受任意数量的参数(类似于CMake命令,如
add\u executable
target\u link\u libraries
do):


(1) 请注意,您实际上可以在
message()
的行为中注意到这一点,默认情况下,它会打印参数的直接串联。当你这样称呼它时:

format_source(src "${TO_FORMAT}")
message("111 " ${TO_FORMAT})
message("111 " "${TO_FORMAT}")
TO_FORMAT
的元素之间没有分隔符:它们各自构成了
消息的独立参数。但是,如果你这样称呼它:

format_source(src "${TO_FORMAT}")
message("111 " ${TO_FORMAT})
message("111 " "${TO_FORMAT}")
元素之间会有分号分隔,因为整个列表(与分号分隔的字符串完全相同)成为
message
的一个参数