CMAKE编写指南

 

CMAKE介绍

CMAKE 是一种跨平台的编译系统, 本文主要是简述cmake中一些常用的技巧,  将会以tips的形式来总结各个技术点.

参考文档:

https://cmake.org/cmake/help/v3.18/guide/tutorial/index.html   // 官方英文文档

https://chenxiaowei.gitbook.io/cmake-cookbook/                      // 中文文档

https://cgold.readthedocs.io/en/latest/overview/cmake-can.html    // 带实例介绍的cmake英文技术文档

 

第一个cmake工程

https://github.com/musiclvme/ToolsPackages/tree/master/CMAKE/01.helloword

 

  1.  CMakeLists.txt范例如下, 含义可以见每一行的注释说明. 
  2.  编译

      mkdir build; cd build; cmake ..; make


# cmake 最小版本要求
cmake_minimum_required (VERSION 3.6)

#指定project名字
project(Mydemo)

#打印log
message("This is a test demo")


#定义变量DEMO_SRC, 表示需要编译的源码文件
file(GLOB_RECURSE DEMO_SRC "${CMAKE_SOURCE_DIR}/src/*.c")


#根据前面定义的DEMO_SRC,生成可执行文件demo
add_executable(demo ${DEMO_SRC})


#target依赖的头文件目录定义
target_include_directories(demo PUBLIC ${CMAKE_SOURCE_DIR})

 

CMAKE TIPS

  • cmake生成代码

使用configure_file命令, 会在顶级源码目录创建include目录,并生成config.h

#设置变量
set(ENABLE_INTERFACE ON)

# generate .h from config.h.in
configure_file (
  "${PROJECT_SOURCE_DIR}/script/config.h.in"
  "${PROJECT_SOURCE_DIR}/include/config.h"
)

config.h.in

#define ENABLE_INTERFACE  @ENABLE_INTERFACE@
  • cmake更改编译器
set(CMAKE_C_COMPILER ${compiler_dir}${CROSS_COMPILE}gcc)
    set(CMAKE_AR "${compiler_dir}${CROSS_COMPILE}ar" CACHE FILEPATH "" FORCE)
    set(CMAKE_AS "${compiler_dir}${CROSS_COMPILE}as")
    set(CMAKE_LD "${compiler_dir}${CROSS_COMPILE}ld")
    SET(CMAKE_STRIP  "${compiler_dir}${CROSS_COMPILE}strip")
    set(CMAKE_C_FLAGS "-g -O3 -Os -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mabi=aapcs -Wl,--gc-sections -ffunction-sections -mthumb -nostdlib")

需要注意的是更改编译器的设置需要放在 project(xxx)之前, 不然就会让编译器进入死循环!!

 

  • cmake执行shell命令: execute_process

COMMAND 后面跟shell 命令

RESULT_VARIABLE 后面跟的变量保存执行的结果, 成功或是失败

OUTPUT_VARIABLE  后面定义的变量返回命令的结果

execute_process(COMMAND which gcc
                    RESULT_VARIABLE GCC_RESULT_STRING
                    OUTPUT_VARIABLE GCC_OUTPUT_STRING)

 

  • cmake add_custom_command执行shell命令
set(ADD_HEADER_SRC "add.h")
set(ADD_HEADER_INC "add.h")
add_custom_command(OUTPUT ${ADD_HEADER_INC}
  COMMAND echo "Generating addlibs header file..."
  COMMAND ${CMAKE_COMMAND} -E copy ${ADD_LIB_DIR}/${ADD_HEADER_SRC} ${CMAKE_CURRENT_BINARY_DIR}/${ADD_HEADER_INC}
)

add_library(addlibs STATIC ${ADD_SRCS} ${ADD_HEADER_INC})

这个需要把add_custom_command输出和target关联,不然不会执行

 

  • 待添加...

实例代码:

https://github.com/musiclvme/ToolsPackages/tree/master/CMAKE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值