我只是想在调试模式下构建一个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)。
另外,我将variable_watch(CMAKE_BUILD_TYPE)
添加到我的主CMakeLists.txt
中,以检查值是否在某处被覆盖。但第一个输出是READ_ACCESS
在我的主另外,我将variable_watch(CMAKE_BUILD_TYPE)
添加到我的主CMakeLists.txt
中,并且已经有Release
的值。
有人知道为什么cmake忽略配置吗?
我使用的是cmake 2.8.7版本
好的,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()
谢谢你的提示!
我猜你的配置有问题。
我在这里写了一个完整的,简单的例子:https://dl.dropboxusercontent.com/u/68798379/cmake-build-type.tar.bz2cmake_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版本在你的系统上运行它时会发生什么?
这个适合我:
IF(${CMAKE_BUILD_TYPE} MATCHES Debug)
...
ENDIF()