我正在使用 CMake 配置一些使用 configure_file
构建我的项目所需的脚本.
其中一些脚本没有任何数学功能,因此我需要使用 math
在我的 CMake 脚本中计算派生值。宏,例如:
math(EXPR EXAMPLE_BLOCK_SIZE "${EXAMPLE_SIZE} / ${EXAMPLE_BLOCK_COUNT}")
然而,似乎math
不支持浮点运算。如果我设置 -DEXAMPLE_SIZE=2.5
和 -DEXAMPLE_BLOCK_COUNT=2
CMake 抛出错误:math cannot parse the expression: "2.5 * 2": syntax error, unexpected
exp_NUMBER, expecting $end (2)
有没有办法直接使用 CMake 宏计算实数?如果没有,实现这一目标的可移植方法是什么?
最佳答案
首先,据我所知,CMake 不支持浮点数学。但是,可以使用 shell 命令来计算变量。以下 CMake 函数应该可以解决问题:
function(floatexpr expr output)
execute_process(COMMAND awk "BEGIN {print ${expr}}" OUTPUT_VARIABLE __output)
set(${output} ${__output} PARENT_SCOPE)
endfunction()
用法示例:
set(A 2.0)
set(B 3.0)
floatexpr("${A} / ${B}" RESULT)
message(${RESULT})
注意:可以使用命令
bc -l <<< 'EXPRESSION'
计算更高级的计算(例如三角函数)。 ,但它不是标准系统包的一部分,可能不会被安装。编辑:一个完全便携(虽然慢得多)的解决方案是使用
try_run
编译运行表达式的 C 文件的功能:function(floatexpr expr output)
SET(FLOAT_EXPR_SRC "
#include <stdio.h>
int main(int argc, char *argv[]){printf(\"%f\\n\", ${expr})\; return 0\;}
")
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFloatExpr.c ${FLOAT_EXPR_SRC})
try_run(RESULT COMPRES ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/CMakeFloatExpr.c
RUN_OUTPUT_VARIABLE __output)
set(${output} ${__output} PARENT_SCOPE)
endfunction()
关于cmake - 在 CMake 中计算实数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43088899/