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,作爲編譯時的參數

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