CMake IF 条件返回错误结果

Posted

技术标签:

【中文标题】CMake IF 条件返回错误结果【英文标题】:CMake IF condition returns wrong result 【发布时间】:2018-03-06 15:57:28 【问题描述】:

我正在尝试为 android 构建本机库,我需要执行条件编译。所以我的 CMakeLists.txt 文件中有以下代码

#set (TEST_VAL OFF) #uncomment this to force set this value
option(TEST_VAL "Test my value")
if(NOT $TEST_VAL EQUAL OFF)
    message(WARNING "TEST MY VAL IS NOT EQUAL OFF ACTUAL VALUE: $DISABLE_SSE ")
else ()
    message(WARNING "TEST MY VAL IS ON ACTUAL VALUE: $DISABLE_SSE ")
endif()

如您所见,我正在尝试获取选项值并编译库。

这就是我提供此选项 (build.gradle) 文件的方式。

android 
   ...
    defaultConfig 
        ...
        externalNativeBuild 
            cmake 
                // Passes optional arguments to CMake.
                arguments "-DTEST_VAL=OFF" 
            
        

   ...

但在我的输出中我只看到:

CMake Warning at CMakeLists.txt:35 (message): TEST MY VAL IS NOT EQUAL OFF ACTUAL VALUE: OFF

那么,OFF 值怎么可能不等于 OFF? 我做错了什么。

非常感谢。

【问题讨论】:

谢谢@john,它实际上是一个有问题的类型。如果我使用 set (TEST_VAL OFF) 显式设置值,主要问题是我有相同的结果 【参考方案1】:

EQUAL 运算符是“如果给定的字符串或变量的值是有效数字并且等于右边的数字,则为真。”

所以只需使用if (NOT TEST_VAL),因为只要给出变量的名称就是“如果常量为 1、ON、YES、TRUE、Y 或非零数字,则为 true。”

如果您无法更改代码或提出问题...

我已经进行了一些测试,以下确实有效:

set(TEST_VAL OFF)
set(OFF 0)

if(NOT $TEST_VAL EQUAL OFF)
    message(STATUS "NOT \$TEST_VAL EQUAL OFF")
endif()

由于EQUAL 需要一个数字进行比较,您可以将字符串OFF 定义为0

所以在你的例子中,这相当于arguments "-DTEST_VAL=OFF -DOFF=0"

参考

if() command documentation

【讨论】:

谢谢,但是我不能修改这个库的代码。我只是想弄清楚如何禁用不需要的选项 @SergeyPekar 我们谈论this 图书馆吗?你试过set(TEST_VAL OFF CACHE INTERNAL "")吗?因为选项是缓存的变量,INTERNAL 会强制该值。 它是专有库,但我尝试编译 that 库,似乎有同样的问题。 @SergeyPekar 好的,EQUAL 检查不适用于字符串。因此,我进行了一些测试并为我的答案添加了解决方案。

以上是关于CMake IF 条件返回错误结果的主要内容,如果未能解决你的问题,请参考以下文章

excel中的if嵌套和ifs哪个计算起来更快?

JavaScript 使用误区 5 (转)

Cmake中的条件判断if/elseif/else

JavaScript 使用误区

简单条件在bash中得到错误的评估结果[重复]

如何使用 RXJava 调用的响应结果作为另一个 RXJava 函数中的 if 语句的条件?