编译工具---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)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cmake-gui是一个图形界面工具,用于帮助配置交叉编译环境。交叉编译是将源代码从一种平台编译成在另一种平台上运行的可执行程序的过程。以下是使用cmake-gui来配置交叉编译环境的步骤: 1. 打开cmake-gui工具。 2. 在"Where is the source code"字段中输入源代码的路径。 3. 在"Where to build the binaries"字段中输入生成的可执行文件的路径。 4. 在"Generator"字段中选择要使用的交叉编译器。 5. 在"Specify toolchain file"字段中选择交叉编译工具链文件。 6. 单击"Configure"按钮,cmake-gui将自动检测交叉编译器和工具链文件,并在窗口中显示相关的设置选项。 7. 根据实际情况修改和配置生成选项,例如选择要构建的目标平台、设置编译器选项等。 8. 单击"Generate"按钮,cmake-gui将生成Makefile或其他构建系统所需的配置文件。 9. 在终端中进入生成的可执行文件路径,并执行构建命令(例如make),即可开始交叉编译。 10. 等待编译过程完成,生成的可执行程序将位于指定的二进制路径中。 使用cmake-gui进行交叉编译配置可以简化配置过程,提供了直观的图形界面操作,同时也可以让开发人员灵活地根据需求进行各种配置选项的设置,方便进行跨平台开发和调试。 ### 回答2: cmake-gui是一个基于图形界面的CMake配置工具,用于帮助开发者进行跨平台和交叉编译的配置。 交叉编译是指在一个主机上构建、编译和运行适用于另一个主机系统的程序。在进行交叉编译配置之前,首先需要确定目标主机的架构、操作系统和编译器等信息。 使用cmake-gui进行交叉编译配置的步骤如下: 1. 打开cmake-gui工具。 2. 在"Where is the source code"一栏中,输入项目的源代码路径。 3. 在"Where to build the binaries"一栏中,输入项目的构建路径。这里可以选择在当前工作空间内或者指定一个新的目录。 4. 点击"Configure"按钮,选择对应的生成器。在弹出的对话框中,根据目标主机的操作系统类型选择对应的生成器。例如,如果目标主机是使用GNU make系统,则选择"Unix Makefiles"生成器。 5. 在"Optional platform for generator"一栏中,填写目标主机所属的平台。例如,如果目标主机是使用armv7架构,则填写"armv7"。 6. 在"Optional toolset to use"一栏中,填写用于构建目标程序的工具集。这里可以选择在配置时指定编译器和工具链。 7. 点击"Finish"按钮,开始进行交叉编译的配置过程。 8. 在配置过程中,cmake-gui会根据所选择的生成器和目标主机的相关信息,分析项目的CMakeLists.txt文件,并生成相应的配置文件。如果配置过程中缺少依赖库或编译工具等,可以在cmake-gui的界面上进行相关设置。 9. 配置完成后,点击"Generate"按钮,即可生成对应的项目构建文件。 通过以上步骤,我们可以使用cmake-gui工具进行交叉编译配置,从而在不同的主机上构建和运行适用于目标主机系统的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值