一、设置编译器的版本
在实际的项目平台中可能安装有多个版本的编译器,同时由于不同的功能可能会需要设置不同的编译参数,可以通过如下方式设置编译器的版本
1、直接在命令行中指定
cmake .. -DCMAKE_CXX_COMPILER=/usr/local/gcc/bin/g++
2、在配置文件中指定
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++语言的编译器
生成的结果
二、设置编译参数
假设我使用g++编译器,添加"-std=c++11", “-Wall"和”-Werror"等参数为例。
2.1 使用add_compile_options命令
通过在CMakeLists.txt文件中添加add_compile_options命令可以起到添加参数的作用,如:
add_compile_options(-std=c++11 -Wall -Werror)
但是这个命令是针对所有类型编译器的,也就是说这里添加的选项会在所有的编译器中运用,比如-std=c++11是针对C++的编译器参数,也会被运用在C语言编译器中,虽然不一定会报错但是终究体验感不好。而且此命令添加的参数是递归的,即在多层目录结构中,根文件下设置选项后,在所有的子目录编译时都会运用。
2.2 通过设置CMAKE_CXX_FLAGS来配置
CMAKE_CXX_FLAGS是针对C++编译器的参数选项,默认保存环境变量CXX_FLAGS的内容,但是如果直接修改这个参数值,那么系统会忽略原CXX_FLAGS的内容。设置方式如下:
set(CMAKE_CXX_FLAGS
-std=c++11
-Wall
-Werror
)
这个变量只在当前文件有效,如果项目中有多个模块,多个编译文件,那么需在每一个CMakeLists.txt文件中都添加对应的命令和参数。
两种方式比较
综上,对于一些在整个项目中通用的编译选项可以使用add_compile_options命令来添加比较方便,对于各个模块中的独立选项则使用CMAKE_CXX_FLAGS变量更好。
三、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
四、实例
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()
# 判断编译器类型,如果是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)
参考:
CMake进阶(一)设置编译选项_qinbo1234567890的博客-CSDN博客_cmake 设置编译顺序
cmake(5):选择编译器及设置编译器选项_翔底的博客-CSDN博客_cmake设置编译器