一、Cmake和Makefile的关系:
Cmake用于依据CmakeList.txt生产makefile文件,省去自行编写makefile文件,最终都是要通过make去编译。
很多芯片厂的sdkdemo等都开始用cmake,因此有必要对cmake进行学习。
二、Cmake相关语法(cmakelist不区分大小写):
cmake_minimum_required(VERSION 3.16)--------用于指定cmake软件最低版本
project(light_bulb)-----用于设置项目名
include_directories(include)---用于设置头文件路径,和gcc等的-I选型一样功能
add_subdirectory(src)-----用于设定包含的子目录,即当前路径的src文件夹
add_executable(test ./a.c)-----用于设置生产的可执行文件名以及依赖的编译源文件,一般单个文件才会这样用,多个
源文件一般很少这样直接用
多个源文件一般使用如下方式:
set(SRC_LIST a.c b.c c.c)-------变量设置,取值用$,和makefile的一样
add_executable(test ${SRC_LIST})----等同add_executable(test a.c b.c c.c )
库生成:
add_library(test SHARED test.c)---生成动态库文件,生成的库名字为libtest.so
add_library(test STATIC test.c)---生成静态库文件,生成的库名字为libtest.a
库链接设定:
target_link_libraries(test test)
打印信息
message("helloworld")
条件判断
if(CMAKE_C_COMPILER_ID MATCHES "GNU")
list(APPEND c_compile_options "-Wno-old-style-declaration")
endif()
if(CONFIG_COMPILER_STACK_CHECK_MODE_NORM)
list(APPEND compile_options "-fstack-protector")
elseif(CONFIG_COMPILER_STACK_CHECK_MODE_STRONG)
list(APPEND compile_options "-fstack-protector-strong")
elseif(CONFIG_COMPILER_STACK_CHECK_MODE_ALL)
list(APPEND compile_options "-fstack-protector-all")
endif()
嵌入式系统中cmake交叉编译需要用到的主要有如下:
set(CMAKE_SYSTEM_NAME Linux) ----设置linux系统
set(CMAKE_SYSTEM_PROCESSOR arm) ----设置arm架构
set(TOOLCHAIN_DIR /home/toolchain)----设置交叉编译工具链路径变量
set(CMAKE_SYSROOT ${TOOLCHAIN_DIR}/arm-buildroot-linux-gnueabihf/sysroot)----c标准库路径
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-gnueabihf-gcc)-------设置交叉编译gcc
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-gnueabihf-g++)------设置交叉编译g++
set(CMAKE_C_FLAGS "-mthumb -mfpu=neon-vfpv4 -mcpu=cortex-a7")----------设置c编译宏定义
set(CMAKE_CXX_FLAGS "-mthumb -mfpu=neon-vfpv4 -mcpu=cortex-a7")----------设置c++编译宏
cmake可以传入参数如
cmake -DCMAKE_TOOLCHAIN_FILE=../arm.cmake
其他高阶的一般少用到,如函数定义,宏定义等
如上一般够可以看懂一般项目的cmakelist或者自己创建基于cmake的项目