cmake if else with option

Ale*_*lex 32 if-statement options cmake

我有问题在cmake中option一起使用if-else.

project(test)

option(TESTE "isso é um teste" OFF)

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

add_executable(test main.cpp)
Run Code Online (Sandbox Code Playgroud)

它总是显示true即使我选择了OFF,我做错了什么?

Sim*_*mon 34

那是因为选项的值存储在cache(CMakeCache.txt)中.

如果更改CMakeLists中的默认值但实际值已存储在缓存中,则只会从缓存中加载该值.

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

  • `rm CMakeCache.txt`或者只是将它移到垃圾桶/回收站. (5认同)

Dan*_*iel 7

我有类似的问题,并能够使用略有不同的方法解决它.

我需要添加一些编译标志,以防cmake使用命令行中的选项调用(即cmake -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
Run Code Online (Sandbox Code Playgroud)

我找到的解决方案是在使用该选项后 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!!
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我不起作用,实际上我必须使用“ -DUSE_MY_LIB = OFF”执行cmake才能使它起作用。如果我只是忽略它,那么它的行为就好像被“ ON”调用一样 (2认同)