cmake忽略了-D CMAKE_BUILD_TYPE=Debug

17

我只是想在调试模式下构建一个 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 标志没有传递给 gcc)。

另外,我在我的主要 CMakeLists.txt 中添加了 variable_watch(CMAKE_BUILD_TYPE) 来检查是否有地方覆盖了该值。但第一个输出是我的主要文件中的 READ_ACCESS 。我还在我的主要 CMakeLists.txt 中添加了 variable_watch(CMAKE_BUILD_TYPE) ,并且那里的值已经是 Release 了。

有人知道为什么 CMake 忽略了配置吗?

我正在使用 cmake 版本 2.8.7。


你有检查过 CMakeCache.txt 文件的内容吗? - Drew McGowen
是的,有设置CMAKE_BUILD_TYPE=Release - 即使手动更改此设置并重新运行cmake也没有效果(CMakeCache.txt中的值会被覆盖)。 - ma0ho
这与此相关吗?http://comments.gmane.org/gmane.comp.kde.devel.general/46310 - Martin G
不,实际上不是这样的。我的问题不在于 CMAKE_BUILD_TYPE=Debug 没有产生应有的效果,而是我无法将 CMAKE_BUILD_TYPE 设置为 Debug - ma0ho
我已经清理了构建目录并尝试了再次编译,但是没有任何效果。另外:你说得对,我正在使用Unix-Makefiles。 - ma0ho
与 https://dev59.com/WKbja4cB1Zd3GeqPahGV 相关。 - Royi
3个回答

19

好的,fgrep -R "CMAKE_BUILD_TYPE" 最终为我找到了问题。在某些 CMakeLists.txt 文件中,我发现了类似以下内容的代码:

SET( CMAKE_BUILD_TYPE Release ... FORCE )

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

对于我而言可行的做法是:

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

谢谢你的提示!


2
对你有效吗?对我来说,使用Ninja作为CMake的目标似乎不起作用。你使用哪个版本的CMake? - Royi
关于现代CMake(例如3.10及以上版本),请参阅KitWare博客-CMake和默认构建类型 - Royi
省略号的作用是什么?省略号代替了被省略的文本。或者它只是一个字面上的省略号吗? - Benilda Key

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版本运行它时会发生什么?


3
如果有人执行cmake -DCMAKE_BUILD_TYPE=DEBUG,会发生什么? - Sergei Krivonos

0
这对我有效:
IF(${CMAKE_BUILD_TYPE} MATCHES Debug)
...
ENDIF()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接