天天看點

CMake進階(一)設定編譯選項CMake設定編譯選項建構Debug版本和Release版本

CMake 進階(一)設定編譯選項

  • CMake設定編譯選項
  • 建構Debug版本和Release版本
    • CMake檔案設定
    • 編譯過程

CMake設定編譯選項

在cmake腳本中,設定編譯選項可以通過add_compile_options指令,也可以通過set指令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。

使用這兩種方式在有的情況下效果是一樣的,但請注意它們還是有差別的:

add_compile_options指令添加的編譯選項是針對所有編譯器的(包括c和c++編譯器),而set指令設定CMAKE_C_FLAGS或CMAKE_CXX_FLAGS變量則是分别隻針對c和c++編譯器的。

#判斷編譯器類型,如果是gcc編譯器,則在編譯選項中加入c++11支援
if(CMAKE_COMPILER_IS_GNUCXX)
   add_compile_options(-std=c++11)
   message(STATUS "optional:-std=c++11")   
endif(CMAKE_COMPILER_IS_GNUCXX)
           

使用add_compile_options添加-std=c++11選項,是想在編譯c++代碼時加上c++11支援選項。但是因為add_compile_options是針對所有類型編譯器的,是以在編譯c代碼時,就會産生如下warning

J:\workspace\facecl.gcc>make b64 
   [ 50%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cdecode.c.obj 
   cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C 
   [100%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cencode.c.obj 
   cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C 
   Linking C static library libb64.a 
   [100%] Built target b64
           

雖然并不影響編譯,但看着的确是不爽啊,要消除這個warning,就不能使用add_compile_options,而是隻針對c++編譯器添加這個option。

是以如下修改代碼,則警告消除。

#判斷編譯器類型,如果是gcc編譯器,則在編譯選項中加入c++11支援
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
    message(STATUS "optional:-std=c++11")   
endif(CMAKE_COMPILER_IS_GNUCXX)
舉一反三,我們就可以想到,add_definitions這個指令也是同樣針對所有編譯器,一樣注意這個差別。
           

建構Debug版本和Release版本

CMake檔案設定

在Visual Studio中我們可以生成debug版本和release版本的程式,使用Cmake我們也可以達到同樣的效果。debug版本的項目生成的可執行檔案需要有調試資訊并且不需要進行優化,而release版本的不需要調試資訊但是需要優化。這些特性在gcc/g++中通過編譯時的參數來決定的,如果将優化程度調到最高需要設定 -O3 ,最低的是 -O0 即不做優化,添加調試資訊的參數是 -g -ggdb,如果不添加這個參數,調試資訊就不會被包含在生成的二進制中

CMake中有一個變量CMAKE_BUILD_TYPE,可以取值枚舉入下:Debug Release RelWithDebInfo 和 MinSizeRel

當這個變量值為Debug的時候,Cmake會使用變量CMAKE_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG中的字元串作為編譯選項生成Makefile,

當這個變量值為Release的時候,工程會使用變量CMAKE_CXX_FLAGS_RELEASE和CMAKE_CFLAGS_RELEASE選項生成Makefile。

現在假設項目中隻有一個檔案main.cpp,下面是一個可以選擇生成debug版和release版的程式的CMakeList.txt:

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

第 5 和 6 行設定了兩個變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 這兩個變量是分别用于 debug 和 release 的編譯選項。 編輯 CMakeList.txt 後需要執行 ccmake 指令生成 Makefile

編譯過程

一般Debug和Release應該在不同的目錄下編譯,否則每次當切換模式時必須把編譯檔案全部删掉。

這裡假設建立兩個目錄Debug和Release來分别用于建構相應的模式:

Release 版本:

mkdir Release

cd Release

cmake -DCMAKE_BUILD_TYPE=Release …

make

Debug 版本:

mkdir Debug

cd Debug

cmake -DCMAKE_BUILD_TYPE=Debug …

make

繼續閱讀