cmake:选择编译器及设置编译器选项
1. 说明
在实际的项⽬平台中可能安装有多个版本的编译器,同时由于不同的功能可能会需要设置不同的编译参数,这篇笔记就记录如何选择指定的编译器和配置参数。
2. 选择编译器
2.1 初始状态
我使⽤的开发平台默认安装的gcc5.5.0,后⾯⼜安装了clang3.8.0,在默认path下C编译器会使⽤gcc 5.5.0,C++编译器使⽤clang3.8.0,如下所⽰:
/build$ cmake ..
-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is Clang 3.8.0
...
后⾯由于项⽬开发的要求我⼜安装了gcc8.3.0版本,PATH也是设置为8.3.0,即在命令⾏下输⼊"gcc -v"默认显⽰8.3.0,但是在cmake会根据PATH路径去查⽀持的编译器,还是会⾸先查到原来的编译器版本。
2.2 使⽤命令⾏
在编译时可以通过参数直接选择指定的编译器的完整路径,⽐如我的gcc8.3.0安装在/usr/local/gcc/bin路径下,在编译时输⼊:
cmake .. -DCMAKE_CXX_COMPILER=/usr/local/gcc/bin/g++
就会在编译时选定gcc-8.3.0
2.3 在配置⽂件中指定
在⽂件中添加:
set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")
直接修改全局变量CMAKE_C_COMPILER和CMAKE_CXX_COMPILER为指定的编译器路径。
注:这两条命令应该放在⽂件的开始位置(cmake_minimum_required命令之下,其他命令之上),否则可能⽆效。
CMAKE_C_COMPILER
原本是保存环境变量"CC"值的变量,⽽CC是编译C语⾔的⾸选编译器,但是在新的CMP0054策略中如果设置的CMAKE_C_COMPILER则会忽略CC的值。
CMAKE_CXX_COMPILER
与CMAKE_C_COMPILER类似,不过这个变量对应的环境变量是CXX,是编译C++语⾔的编译器。
结果如下:
$ cmake ..
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
...
3. 配置编译参数
假设我使⽤g++编译器,添加"-std=c++11", “-Wall"和”-Werror"等参数为例。
3.1 使⽤add_compile_options命令
通过在⽂件中添加add_compile_options命令可以起到添加参数的作⽤,如:
add_compile_options(-std=c++11 -Wall -Werror)
但是这个命令是针对所有类型编译器的,也就是说这⾥添加的选项会在所有的编译器中运⽤,⽐如-std=c++11是针对C++的编译器参数,也会被运⽤在C语⾔编译器中,虽然不⼀定会报错但是终究体验感不好。⽽且此命令添加的参数是递归的,即在多层⽬录结构中,根⽂件下设置选项后,在所有的⼦⽬录编译时都会运⽤。
3.2 通过设置CMAKE_CXX_FLAGS来配置
CMAKE_CXX_FLAGS是针对C++编译器的参数选项,默认保存环境变量CXX_FLAGS的内容,但是如果直接修改这个参数值,那么系统会忽略原CXX_FLAGS的内容。设置⽅式如下:
set(CMAKE_CXX_FLAGS
-std=c++11
-Wall
-Werror
)
这个变量只在当前⽂件有效,如果项⽬中有多个模块,多个编译⽂件,那么需在每⼀个⽂件中都添加对应的命令和参数。
3.3 两种⽅式⽐较
add_compile_options CMAKE_CXX_FLAGS
gnu编译器对所有编译器有效只针对C++编译器
作⽤域是全局,对所有编译⽂件有效作⽤域是单个编译⽂件
综上,对于⼀些在整个项⽬中通⽤的编译选项可以使⽤add_compile_options命令来添加⽐较⽅便,对于各个模块中的独⽴选项则使⽤CMAKE_CXX_FLAGS变量更好。
4. 命令解析
4.1 add_compile_options
将编译器选项添加到当前及⼦⽬录的源⽂件的编译中。
⽤法
add_compile_options(<option> ...)
option:编译选项,注意对于不同编译器,⽀持的选项可能不⼀样。
⽰例
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
4.2 add_compile_definitions
将预编译参数添加到源⽂件的编译中,对下级⼦⽬录同样有效。
⽤法
add_compile_definitions(<definition> ...)
预编译命令会添加到COMPILE_DEFINITIONS⽬录属性中。
5. CMAKE__FLAGS变量
这⾥⽤到的CMAKE_CXX_FLAGS变量是只针对C++编译器的选项,对于其他编程语⾔,只要替换部分就可以,在当前cmake版本(3.17.2)中⽀持如下语⾔:
CMAKE_C_FLAGS:C语⾔编译器选项,对应于环境变量CFLAGS
CMAKE_CXX_FLAGS:C++语⾔编译器选项,对应于环境变量CXXFLAGS
CMAKE_CUDA_FLAGS:CUDA语⾔编译器选项,对应于环境变量CUDAFLAGS
CMAKE_Fortran_FLAGS:Fortran语⾔编译器选项,对应于环境变量FFLAGS
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论