【问题标题】:cmake ignores -D CMAKE_BUILD_TYPE=Debugcmake 忽略 -D CMAKE_BUILD_TYPE=Debug
【发布时间】:2014-05-28 09:25:39
【问题描述】:

我只是想在调试模式下构建一个 cmake 项目以启用断言。我尝试了以下版本:

cmake -D CMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE=Debug -L ../../

不幸的是,这些都没有达到预期的效果——CMAKE_BUILD_TYPE 设置为Debug(因此NDEBUG-flag 没有传递给 gcc)。

此外,我将variable_watch(CMAKE_BUILD_TYPE) 添加到我的主要CMakeLists.txt 以检查值是否在某处被覆盖。但第一个输出是我主要的READ_ACCESS 此外,我将variable_watch(CMAKE_BUILD_TYPE) 添加到我的主要CMakeLists.txt 中,并且那里的值已经是Release

有人知道为什么 cmake 会忽略配置吗?

我正在使用 cmake 版本 2.8.7。

【问题讨论】:

  • 你查看CMakeCache.txt的内容了吗?
  • 是的,设置了CMAKE_BUILD_TYPE=Release - 甚至手动更改此设置然后重新运行cmake 也没有效果(CMakeCache.txt 中的值再次被覆盖)。
  • 不,不是。我的问题不是CMAKE_BUILD_TYPE=Debug 没有它应该有的效果,而是我不能将CMAKE_BUILD_TYPE 设置为Debug..
  • 我已经清理了构建目录并再次尝试,但也没有任何效果。并且:你是对的。我正在使用 Unix-Makefiles。

标签: c cmake ndebug


【解决方案1】:

好的,fgrep -R "CMAKE_BUILD_TYPE" 终于为我找到了问题所在。在一些CMakeLists.txt-file 中我发现了类似的东西:

SET( CMAKE_BUILD_TYPE Release ... FORCE )

这会覆盖每个用户定义的参数(因为FORCE)。

对我有用的是:

IF( NOT CMAKE_BUILD_TYPE )
   SET( CMAKE_BUILD_TYPE Release ... FORCE )
ENDIF()

感谢您的提示!

【讨论】:

  • 它对你有用吗?对我来说,使用 Ninja 作为 CMake 的目标,它似乎不起作用。你使用什么版本的 CMake?
  • 关于现代 CMake(比如 3.10 及更高版本)请参阅 KitWare Blog - CMake and the Default Build Type
  • ... 有什么用?省略号替换被遗漏的文本。还是字面意思...?
【解决方案2】:

我认为你的配置有问题..

我在这里写了一个完整、简单的例子: https://dl.dropboxusercontent.com/u/68798379/cmake-build-type.tar.bz2

cmake_minimum_required (VERSION 2.8)

project(playlib)

message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")

IF(CMAKE_BUILD_TYPE MATCHES Debug)
  message("Debug build.")
ELSEIF(CMAKE_BUILD_TYPE MATCHES Release)
  message("Release build.")
ELSE()
  message("Some other build type.")
ENDIF()

add_library(TESTLIB SHARED src/test.c)

当你使用

执行 cmake 时
cmake -DCMAKE_BUILD_TYPE=Debug ../../

它给出以下输出:

$ ./gen-linux.sh
-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMAKE_BUILD_TYPE = Debug
Debug build.
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wojci/stack-overflow/cmake-build-type/build/linux

它表明 CMAKE_BUILD_TYPE 是从命令行设置的,并且在 CMakeLists.txt 配置中被识别。

当您使用您的 CMake 版本在系统上运行它时会发生什么?

【讨论】:

  • 如果有人做了这个cmake -DCMAKE_BUILD_TYPE=DEBUG怎么办?
【解决方案3】:

这对我有用:

IF(${CMAKE_BUILD_TYPE} MATCHES Debug)
...
ENDIF()

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2010-12-18
    • 2014-02-18
    • 2023-03-21
    • 2015-07-31
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多