IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 编译工具---Cmake分析 -> 正文阅读

[C++知识库]编译工具---Cmake分析

1、cmake 编译工具

Cmake是一个跨平台的编译工具,用简单的语言描述所有平台的编译过程,可以生成makefile或者project文件,类似于UNIX下的automake,常用在管理庞大的项目中。

1.1 Cmake 使用方法

Cmake的语法均写在CMakeList.txt文件中(.config文件中也包含部分变量定义),当该文件确定后就可用cmake命令对相关的变量进行配置(该命令需指向CMakeList.txt文件所在的目录),配置完成后可用cmake命令生成相应的makefile文件,之后执行makefile文件便可生成可执行文件(.out 、.bin 、.pac)。
基本使用流程:

  1. cmake /xxx/xxx //配置编译选项
  2. cmake /xxx/xxx //根据CMakeList.txt生成makefile文件
  3. make //执行makefile文件,编译程序,生成可执行文件

1.2 Cmake的常用语法

“#” 注释
set 给变量显示定义及赋值
${} 引用变量,在if中直接使用变量名引用即可
if(var)…else()…endif()
foreach(f ${var}…endforeach(f)
while()…endwhile()

1.3 Cmake的内部变量

内部变量可在CMakeList.txt文件中以set来使用,也可在cmake命令中使用。
CMAKE_SOURCE_DIR :工程顶层目录所在的路径
CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt所在的路径,建议使用CURRENT_SOURCE,不建议使用SOURCE_DIR,因为如果主工程目录改变了,SOURCE_DIR也就会改变,很容易造成编译错误
CMAKE_ CURRENT _BINARY_DIR:工程编译时的路径
CMAKE_C_COMPILER:指定C编译器
CMAKE_CXX_COMPILER:指定C++编译器
CMAKE_C_FLAGS:编译C文件时的选项,如-g
EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径
LIBRARY_OUTPUT_PATH:库文件路径
CMAKE_BUILD_TYPE: build 类型(Debug, Release, …),
BUILD_SHARED_LIBS: shared /static libraries( OFF/ON)

1 .4 Cmake的常用命令

cmake_minimum_required(VERSIONV 3.13) #指定cmake最低版本 project (ROBERT) project (ROBERT) #指定项目名称

include_directories (KaTeX parse error: Expected 'EOF', got '#' at position 36: …CE_DIR}/World) #?增加World为include…{HELLO_SOURCE_DIR}表示项目根目录), 即指定头文件的搜索路径,相当于指定gcc的-I参
link_directories (${CMAKE_CURRENT_BINARY_DIR}/World)) #增加World为link目录,即指定动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) #将当前CMakeLists.txt所在的路径的下的src中所有的.cpp文件组成的列表保存到变量SRC中,常用来收集源文件列表
set(target bootloader) #设置bootloader变量
set(CMAKE_C_COMPILER arm-none-eabi-gcc) #指定交叉编译器和工具

add_library(World demo.cxx demo.c) #将.cxx/.c编译成静态库如World.a add_subdirectory (World) #包含World子目录 add_executable (WorldDemo demo.cxx demo_b.c)
#将.cxx/.c编译成可执行文件,即指定编译一个可执行文件, WorldDemo为生成可执行文件的文件名, .cxx/.c为其指定的源文件

add_custom_target(example ALL DEPENDS ${TEST_FILE})
#增加一个没有输出的目标example,,使得它总是被构建,all选项该目标会被添加到默认的构建目标增加 add_custom_command(xxx…) #增加客制化的构建规则到生成的构建系统中

add_definitions(-DDEBUG) #在gcc命令行添加DEBUG宏定义,(即为当前路径以及下层路径的目标加入编译器命令行定义,原意是用来增加预处理器的宏定义),定义可能在命令调用之前或之后被添加

add_dependencies(KaTeX parse error: Expected group after '_' at position 16: {target } build_?{target }) #添加编译依赖项 add_compile_options(${abi_options } –g –Os ${lto_compile_option} ) #为abi_options增加禁用调试信息和使用-OS编译的编译选项, 即为当前路径和下层路径的目标增加编译器命令行选项,选项在此命令被调用后添加

target_compile_definetions(KaTeX parse error: Expected 'EOF', got '#' at position 38: …LOG_TAG=XXX_XX)#?编译给定的 <target> …{abi_options} –Os ${lto_compile_option}) #为链接步骤增加选项,选项在此命令被调用后添加

define_property(GLOBAL PROPERT xxx ) #在作用域中定义一个属性,
set_property(GLOBAL…PROPERT xxx) #在指定域中设置一个命名属性 get_property()
get_property(xxx GLOBAL…) #在指定域中设置一个命名属性 get获取一个属性值

set_target_properties(…PROPERTIES ) #设置属性,如设置库文件.a的输出目录 target_include_directories(…private) #以非级联依赖方式指定编译当前模块所依赖的头文件 target_include_targets(private kernel fs…) #以非级联方式指定编译当前模块所依赖的静态库.a文件 target_link_libraries(WorldDemo Hello) #将可执行文件与Hello连接成最终文件WorldDemo

1.5 例子分析

cmake_minimum_required(VERSION 3.17)

#specify cross compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
#set(CMAKE_C_LINK_EXECUTABLE ld)
#set(CMAKE_CXX_LINK_EXECUTABLE ld)

#project settings
project(stm32demo C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)

add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:38:20  更:2021-10-01 16:39:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 19:43:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码