Cmake生成debug版本和release版本

在Visual Studio中我们可以生成debug版本和release版本的程序,使用Cmake我们也可以达到同样的效果。debug版本的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版本的不需要调试信息但是需要优化。这些特性在gcc/g++中通过编译时的参数来决定的,如果将优化程度调到最高需要设置 -O3 ,最低的是 -O0 即不做优化,添加调试信息的参数是 -g  -ggdb,如果不添加这个参数,调试信息就不会被包含在生成的二进制中, -Wall  显示报警信息

CMake中有一个变量CMAKE_BUILD_TYPE,可以取值枚举入下:Debug   Release  RelWithDebInfo  和  MinSizeRel

编译不同语言CC++语言用的标记不同

当这个变量值为Debug的时候,

C:Cmake会使用变量CMAKE_C_FLAGS_DEBUG中的字符串作为编译选项生成Makefile;

C++:Cmake会使用变量CMAKE_CXX_FLAGS_DEBUG中的字符串作为编译选项生成Makefile;

当这个变量值为Release的时候,

C:Cmake会使用变量CMAKE_C_FLAGS_RELEASE中的字符串作为编译选项生成Makefile;

C++:Cmake会使用变量CMAKE_CXX_FLAGS_RELEASE中的字符串作为编译选项生成Makefile;

其他选项以此类推,RelWithDebInfo  和  MinSizeRel

 

指定C和C++使用特定的编译器

set(CMAKE_C_COMPILER "/usr/local/gcc")   //指定编译器的路径即可

set(CMAKE_CXX_COMPILER "/usr/local/g++")    //指定编译器的路径即可

cmake -DCMAKE_C_COMPILER=/path/to/gcc/bin/gcc   -DCMAKE_CXX_COMPILER=/path/to/gcc/bin/g++  .

另外一种方式如下,但该种方式将影响该机器上所有的项目编译

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make

以下网址有详细说明

https://stackoverflow.com/questions/17275348/how-to-specify-new-gcc-path-for-cmake  

现在假设项目中只有一个文件main.cpp,下面是一个可以选择生成debug版和release版的程序的CMakeList.txt:

1 PROJECT(main)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3 SET(CMAKE_SOURCE_DIR .)
4 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
5 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
6 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
7 ADD_EXECUTABLE(main ${DIR_SRCS})

第 4和5 行设置了两个变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项。 编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 "ccmake ." 进入一个图形化界面,如下图所示:

 

ccmake的界面

 

执行了configure后的ccmake的界面

 

 

下面我们首先生成debug版的Makefile:将变量CMAKE_BUILD_TYPE设置为Debug,按“c”进行configure,按“g”生成Makefile并推出。这时执行命令 find * | xargs grep  “O0”后结果如下:

 

执行命令 find * | xargs grep  “O0”后的结果

 

CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb 
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O0 -Wall -g -ggdb 
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic 
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

这个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_DEBUG 作为编译时的参数。

下面我们将生成Release版本的Makefile:再次执行“ccmake ." ,将变量CMAKE_BUILD_TYPE设置为Release,生成Makefile并推出。执行命令 find * | xargs grep  “O0”后结果如下:

find * | xargs grep "O0"的执行结果

CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

而执行命令 find * | xargs grep "O3" 后结果如下:

CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall 
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall 
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic 
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")


这两个结果说明生成的Makefile中使用了CMAKE_CXXFLAGS_RELEASE,作为编译时的参数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章