49

我在 cmake 中使用optionwith语句时遇到问题。if-else

project(test)

option(TESTE "isso é um teste" OFF)

if(TESTE)
  message("true")
else()
  message("false")
endif()

add_executable(test main.cpp)

即使我在选项中关闭它也总是显示true,我做错了什么?

4

3 回答 3

47

这是因为选项的值存储在缓存中 ( CMakeCache.txt)。

如果您更改了CMakeLists 中的默认值,但实际值已经存储在缓存中,它只会从缓存中加载值。

因此,要测试 CMakeLists 中的逻辑,请在每次重新运行 CMake 之前删除缓存。

于 2014-03-18T14:08:40.540 回答
12

我有一个类似的问题,并且能够使用稍微不同的方法来解决它。

我需要添加一些编译标志,以防使用命令行中的选项(即)调用cmakecmake -DUSE_MY_LIB=ON如果在cmake调用中缺少该选项,我想回到关闭该选项的默认情况。

我遇到了同样的问题,这个选项的值在调用之间被缓存:

cmake -DUSE_MY_LIB=ON .. #invokes cmake and puts USE_MY_LIB=ON in CMake's cache.
cmake ..                 #invokes cmake with the cached option ON, instead of OFF

我找到的解决方案是在使用该选项后从 CMakeLists.txt中清除该选项:

option(USE_MY_LIB "Use MY_LIB instead of THEIR_LIB" OFF) #OFF by default
if(USE_MY_LIB)
    #add some compilation flags
else()
    #add some other compilation flags
endif(USE_MY_LIB)
unset(USE_MY_LIB CACHE) # <---- this is the important!!

注意:unset选项自 cmake v3.0.2 起可用

于 2018-02-26T08:46:17.510 回答
2

试试这个,它对我有用

unset(USE_MY_LIB CACHE)
于 2020-03-24T19:46:18.690 回答