1. 程式人生 > >cmake:設定編譯選項的講究(add_compile_options和CMAKE_CXX_FLAGS的區別)

cmake:設定編譯選項的講究(add_compile_options和CMAKE_CXX_FLAGS的區別)

在cmake指令碼中,設定編譯選項可以通過add_compile_options命令,也可以通過set命令修改CMAKE_CXX_FLAGSCMAKE_C_FLAGS
使用這兩種方式在有的情況下效果是一樣的,但請注意它們還是有區別的:
add_compile_options命令新增的編譯選項是針對所有編譯器的(包括c和c++編譯器),而set命令設定CMAKE_C_FLAGSCMAKE_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)
  • 1
  • 2
  • 3
  • 4
  • 5

使用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)
  • 1
  • 2
  • 3
  • 4
  • 5

舉一反三,我們就可以想到,add_definitions這個命令也是同樣針對所有編譯器,一樣注意這個區別。

參考資料:
https://cmake.org/
https://cmake.org/cmake/help/v3.1/command/add_compile_options.html
https://cmake.org/cmake/help/v3.1/command/add_definitions.html
https://cmake.org/cmake/help/v3.1/command/set.html
https://cmake.org/cmake/help/v3.1/variable/CMAKE_LANG_FLAGS.html