天天看點

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

編譯不同語言C和C++語言用的标記不同

當這個變量值為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的界面

Cmake生成debug版本和release版本

執行了configure後的ccmake的界面

Cmake生成debug版本和release版本

下面我們首先生成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,作為編譯時的參數

繼續閱讀