Flo*_*ian 54
CMake的两个原则你必须记住:
例子
set(_my_text "A B C")与message("${_my_text}")将使A B Cset(_my_list A B C)与message("${_my_list}")将使A;B;Cset(_my_list "A" "B" "C")与message("${_my_list}")将使A;B;Cset(_my_list "A" "B" "C")与message(${_my_list})将使ABC一些经验法则
你应该考虑一些经验法则:
a)当你的变量包含文本时 - 尤其是包含分号的文本 - 你应该添加引号.
推理:分号是CMake中列表元素的分隔符.所以在一个应该是一个的文本周围加上引号(它可以在任何地方使用,对于我个人看起来更好用CMake语法高亮)
编辑:感谢@schieferstapel提示
b)更确切地说:具有已经有引号的空格的变量内容确实保留了这些引号(想象它变为变量内容的一部分).这可以在任何地方使用,也可以是不带引号(正常或用户定义的函数参数),其中突出的是if()调用异常,其中CMake在变量扩展后重新解释未加引号变量的内容(另请参见经验法则#3和策略CMP0054:仅将if()参数解释为不带引号时的变量或关键字)
例子:
set(_my_text "A B C")与message(${_my_text})也给A B Cset(_my_text "A;B;C")与if (${_my_text} STREQUAL "A;B;C")将使if given arguments: "A" "B" "C" "STREQUAL" "A;B;C" Unknown arguments specified如果您的变量包含列表,则通常不添加引号.
推理:如果你给CMake命令提供类似文件列表的东西,它通常需要一个字符串列表而不是一个包含列表的字符串.您可以在foreach()命令接受ITEMS或中看到差异LISTS.
if() 声明是一种特殊情况,通常你甚至不戴牙箍.
推理:字符串可以 - 在扩展后 - 再次评估变量名称.为了防止这种情况,建议只为要比较其内容的变量命名(例如if (_my_text STREQUAL "A B C")).
COMMAND 例子
set(_my_text "A B C")与COMMAND "${CMAKE_COMMAND}" -E echo "${_my_text}"意志
cmake.exe -E echo "A B C"在VS /视窗cmake -E echo A\ B\ C对GCC/Ubuntu的A B Cset(_my_text "A B C")与COMMAND "${CMAKE_COMMAND}" -E echo "${_my_text}" VERBATIM意志
cmake.exe -E echo "A B C"在VS /视窗cmake -E echo "A B C"对GCC/Ubuntu的A B Cset(_my_list A B C)与COMMAND "${CMAKE_COMMAND}" -E echo "${_my_list}"意志
cmake.exe -E echo A;B;CA,B: command not found,C: command not foundset(_my_list A B C)与COMMAND "${CMAKE_COMMAND}" -E echo "${_my_list}" VERBATIM意志
cmake.exe -E echo "A;B;C"A;B;Cset(_my_list "A" "B" "C")与COMMAND "${CMAKE_COMMAND}" -E echo "${_my_list}" VERBATIM意志
cmake.exe -E echo "A;B;C"A;B;Cset(_my_list "A" "B" "C")与COMMAND "${CMAKE_COMMAND}" -E echo ${_my_list}
VERBATIM意志
cmake.exe -E echo A B CA B Cset(_my_list "A + B" "=" "C")与COMMAND "${CMAKE_COMMAND}" -E echo ${_my_list} VERBATIM意志
cmake.exe -E echo "A + B" = CA + B = C一些经验法则与add_custom_target()/ add_custom_command()/execute_process()
在COMMAND调用中使用变量时,您应该考虑一些经验法则:
a)对包含文件路径的参数使用引号(如包含可执行文件本身的第一个参数).
推理:它可以包含空格,可以重新解释为COMMAND调用的单独参数
b)见上文,如果变量set()确实包含引号,也可以使用.
仅当您要将某些内容连接到要传递给被调用的可执行文件的单个参数时,才使用引号.
推理:变量可以包含一个参数列表 - 当使用引号时 - 将无法正确提取(分号而不是空格)
始终VERBATIM使用add_custom_target()/ 添加选项add_custom_command()
推理:否则跨平台行为是未定义的,您可能会对引用的字符串感到惊讶.
参考
| 归档时间: |
|
| 查看次数: |
11278 次 |
| 最近记录: |