【问题标题】:CMake IF condition returns wrong resultCMake IF 条件返回错误结果
【发布时间】: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) 显式设置值,主要问题是我有相同的结果

标签: android c++ cmake android-ndk


【解决方案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"

参考

【讨论】:

  • 谢谢,但是我不能修改这个库的代码。我只是想弄清楚如何禁用不需要的选项
  • @SergeyPekar 我们谈论this 图书馆吗?你试过set(TEST_VAL OFF CACHE INTERNAL "")吗?因为选项是缓存的变量,INTERNAL 会强制该值。
  • 它是专有库,但我尝试编译 that 库,似乎有同样的问题。
  • @SergeyPekar 好的,EQUAL 检查不适用于字符串。因此,我进行了一些测试并为我的答案添加了解决方案。
猜你喜欢
  • 2017-07-20
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2016-11-29
  • 2021-05-05
  • 2020-04-28
  • 1970-01-01
相关资源
最近更新 更多