cmake(二十八)Cmake工具链

一    选择编译器及设置编译器选项

(1)应用场景

1)在'实际的项目平台中'可能安装有'多个版本'的'编译器'

2)同时由于'不同的功能'可能会需要设置'不同的编译参数'

(2)初始状态

(3)IDE工具CLion配置

(4)CMAKE_C_COMPILERCMAKE_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()

二    CMAKE_TOOLCHAIN_FILE

cmake设置交叉编译

①    工具链

++++++++++++++'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'

②  交叉编译适用到Android平台

备注: '默认'cmake编译的出来的是'x86 64位'(PC硬件环境),现在需要改成交叉编译'适用'到'Android'平台上

③  其它参考

工具链

交叉编译参数的解读

交叉编译参数解读

交叉编译配置

相关报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值