cmake - 在 CMake 中计算实数

标签 cmake

我正在使用 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/

相关文章:

c - 打包要从 C 调用的 Lua 脚本文件的最佳做法是什么。使用 CMake

CMake - 检查是否存在更高级别的目录

c++ - 如何在 ROS Indigo 下正确链接 opencv3(使用 CMake)?

c++ - 在 Windows 中使用 CMake 和 clang++ 设置链接器子系统

android - 在 CMAKE 中包含来自 Android 项目的不同文件夹的静态库

c++ - vcpkg cmake 找不到 botan

visual-studio - AVX512 和 MSVC 预处理器符号

c++ - CMake 不在子模块 B 中包含子模块 A 的头目录

CMake设置默认搜索路径?

C++ CMake 编译指令与?