1、cmake 编译工具
Cmake是一个跨平台的编译工具,用简单的语言描述所有平台的编译过程,可以生成makefile或者project文件,类似于UNIX下的automake,常用在管理庞大的项目中。
1.1 Cmake 使用方法
Cmake的语法均写在CMakeList.txt文件中(.config文件中也包含部分变量定义),当该文件确定后就可用cmake命令对相关的变量进行配置(该命令需指向CMakeList.txt文件所在的目录),配置完成后可用cmake命令生成相应的makefile文件,之后执行makefile文件便可生成可执行文件(.out 、.bin 、.pac)。 基本使用流程:
- cmake /xxx/xxx //配置编译选项
- cmake /xxx/xxx //根据CMakeList.txt生成makefile文件
- 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)
|