(1)应用场景
1)在'实际的项目平台中'可能安装有'多个版本'的'编译器'
2)同时由于'不同的功能'可能会需要设置'不同的编译参数'
(2)初始状态
(3)IDE工具CLion配置
(4)CMAKE_C_COMPILER和CMAKE_CXX_COMPILER
细节: 这两条命令应该放在'文件的开始'位置(cmake_minimum_required'命令之下','其他命令之上'),否则可能'无效'
1)CMAKE_C_COMPILER
原本是保存环境变量"CC"值的变量,而CC是'编译C语言'的首选编译器,但是在'新的CMP0054(3.1)策略中'如果设置的CMAKE_C_COMPILER则会'忽略'CC的值
2)CMAKE_CXX_COMPILER
与CMAKE_C_COMPILER类似,不过这个变量对应的'环境变量是CXX',是'编译C++语言'的编译器
① 命令行修改
cmake .. -DCMAKE_CXX_COMPILER=/usr/local/gcc/bin/g++
编译时可以'通过参数'直接选择'指定的编译器'的完整路径
备注: 默认是'PATH'路径寻找
② set指令修改
set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")
(5)配置编译参数
1)CMAKE_C_FLAGS:'C语言'编译器'选项',对应于'环境变量CFLAGS'
2)CMAKE_CXX_FLAGS:'C++语言'编译器'选项',对应于'环境变量CXXFLAGS'
① set指令
1)C标准
++++++++++++++++'C编译参数'++++++++++++++++
set(CMAKE_C_FLAGS
-Wall
-Werror
-std=c99
)
'C标准库':/usr/lib64/libc.so
2)C++标准
1)GCC4.8.5'默认支持'C++98,若程序中'使用到C++11'的特性,则'报错'
2)想要'支持C++11','编译'时加上'-std=c++11'即可
++++++++++++++++'C++编译参数'++++++++++++++++
set(CMAKE_CXX_FLAGS
-std=c++11
-Wall
-Werror
)
说明:'gcc'的编译参数
-Wall:打开gcc的'所有[尽可能](all)警告'
-Werror:它要求gcc将所有的'警告'当成'错误'进行处理
② add_compile_options命令
add_compile_options(-std=c++11 -Wall -Werror)
③ 区别
④ 补充
add_definitions(-DLINUX)
# 设置C编译选项
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -std=c99")
# 设置CXX编译选项-->'c++11标准'
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11")
(6)DEBUG和RELEASE
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
① CMAKE_BUILD_TYPE
Debug版会使用'参数-g'
Release版使用'-O3'
++++++++++++'分割线'++++++++++++
1)'debug版本'的项目生成的可执行文件需要有'调试信息'并且'不需要进行优化' -->'测试版本'
2)'release版本不需要'调试信息但是'需要优化' -->'发布版本'
备注: 这些'特'性在'gcc/g++中'通过编译时的'参数'来决定的
3)如果将优化程度调到'最高'需要设置 '-O3',最低的是 -O0 即'不做优化',添加'调试信息的参数'是 '-g -ggdb',如果'不添加'这个参数,调试信息就'不会'被包含在'生成的二进制中'
1)CMake 中有一个变量 'CMAKE_BUILD_TYPE',可以的'取值'是 'Debug'、'Release'、Rel、WithDebInfo 和 MinSizeRel
2)当这个变量'值为 Debug' 的时候,CMake 会使用变量 CMAKE_'CXX'_FLAGS_'DEBUG' 和 CMAKE_'C'_FLAGS_'DEBUG' 中的'字符串'作为编译选项生成 Makefile
3)当这个变量'值为 Release' 的时候,工程会使用变量 CMAKE_'CXX'_FLAGS_'RELEASE' 和 CMAKE_'C'_FLAGS_'RELEASE' 选项生成 Makefile
cmake -DCMAKE_BUILD_TYPE=Release ../
具体: 建立debug/release'两目录','分别'在其中执行cmake -DCMAKE_BUILD_TYPE=Debug(或Release),需要'编译不同版本时'进入'不同目录'执行make即可
备注: '不建议'在'CMakeLists.txt'中声明'set(CMAKE_BUILD_TYPE Release)'
(7)平台
CMake中'if语句'中对于条件真假的判断,'不完全'是以变量的真假为标准的,有时还和'变量名有关'
if(WIN32)
message("this operation platform is windows")
elseif(UNIX)
message("this operation platform is Linux")
endif()
① 工具链
++++++++++++++'toolchain'中'包含'的信息++++++++++++++
1)编译器信息 --> 'c complier' && 'cxx complier'
2)flags(c flag && cxx 'flag' && 'debug|release'信息)
3)工具-->('归档'打包)工具'ar' && '链接器'linker等
'补充': 最好每个'平台(架构)|系统'各自有一份'toolchain.cmake'文件
'运行':cmake -DCMAKE_TOOLCHAIN_FILE=../linux.toolchain.cmake
备注: 基于'平台(Linux、Windows、Mac)'、架构'x86_64、arm'
备注: '默认'cmake编译的出来的是'x86 64位'(PC硬件环境),现在需要改成交叉编译'适用'到'Android'平台上
③ 其它参考