【问题标题】:cmake if else with optioncmake if else 选项
【发布时间】:2014-04-24 06:26:48
【问题描述】:

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

project(test)

option(TESTE "isso é um teste" OFF)

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

add_executable(test main.cpp)

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

【问题讨论】:

    标签: if-statement cmake cmakelists-options


    【解决方案1】:

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

    如果您更改了 CMakeLists 中的 default 值,但 actual 值已存储在缓存中,它只会从缓存中加载该值。

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

    【讨论】:

    • rm CMakeCache.txt 或将其移至垃圾箱/回收站。
    • 如果我们在调用 CMake 时设置选项的实际值,该选项将被覆盖。无需删除 CMakeCache.txt。只有当我们决定不指定实际值并且我们想使用默认值时,我们才需要删除 CMakeCache.txt,而在之前的 cmake 运行中,我们确实指定了一个与默认值不同的值。
    【解决方案2】:

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

    我需要添加一些编译标志,以防 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
    

    我找到的解决方案是在使用该选项后从内部 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 起可用

    【讨论】:

    • 这对我不起作用,我实际上必须使用“-DUSE_MY_LIB=OFF”执行 cmake 才能使其工作。如果我只是省略它,那么它会一直表现得好像是用“ON”调用的
    • 另外@m4l490n 你试过在 if-else 部分添加一个集合吗?如果显然对我不起作用。
    【解决方案3】:

    试试这个,它对我有用

    unset(USE_MY_LIB CACHE)
    

    【讨论】:

    • 你为什么不赞成这个答案?它确实有效。未设置(USE_MY_LIB CACHE)
    • @furkantokac cuz CACHE CACHE
    • 另外,请解释答案,链接相关文档。 “为我工作”可以很好地得到一个肮脏的修复,但不应该是工程师停止的地方。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2023-04-09
    • 2011-06-03
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多