cmake:設定編譯選項的講究(add_compile_options和CMAKE_CXX_FLAGS的區別)
在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)
- 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