CMake学习记录

news/2025/2/22 1:13:52/

一、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的项目


http://www.ppmy.cn/news/51993.html

相关文章

Ubuntu20.04安装CloudCompare及简单使用说明

参考:点云工具CloudCompare安装与使用_瞻邈的博客-CSDN博客 目录 1. 安装方法 1.1. 从官方网址直接下载并安装 1.2. 编译安装 1.3.

FlinkSQL kafka完整案例 可直接复制使用

为自己记录一下flinksql 消费kafka json数据 并写入doris的完整案例 用完发现,flinksql 是真的香。 虽然尽量追求完整,但是从kafka造数据开始写,过于累赘因此省略。正文开始。 单表 kafka原始数据 {"id":1,"name":&q…

SQL Server基础 第四章 select定制查询(select中的各种查询筛选条件)

本章主要介绍 select 语句查询数据的基本用法,其中包括查询指定字段信息、条件查询等。 目录 1、比较运算符、逻辑运算符 (1)查询phone大于500且不是单县的 (2)查询地址为烟台或者单县但是phone要大于666的 &#…

Rust之泛型、特性和生命期(一):基本概念

开发环境 Windows 10Rust 1.69.0 VS Code 1.77.3 项目工程 这里继续沿用上次工程rust-demo 泛型、特性和生命期 每种编程语言都有有效处理概念重复的工具。在Rust中,一个这样的工具就是泛型:具体类型或其他属性的抽象替身。我们可以表达泛型的行为或…

JSP公司办公信息管理系统(源代码+论文)

随着计算机科学的发展,数据库技术在Internet和Intranet中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。本文描述了如何使用JSP技术来组建企业内部信息管理网站。实现了:员工信息的发布与共享,本文中的员工信息管…

Sentinel——限流规则

目录 快速入门 簇点链路 案例 流控模式 流控模式——关联 流控模式——链路 案例 流控效果 流控效果——warm-up 流控效果——排队等待 热点参数限流 快速入门 簇点链路 簇点链路:就是项目内的调用链路,链路中被监控的每个接口就是一个资源。…

904. 水果成篮

904. 水果成篮 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要…

【Maven】Maven的打包方式和执行jar

Maven的打包方式和执行jar 1. Jar1.1 Pom.xml1.2 Run1.3 自动执行方法 2. Assembl1y2.1 Pom.xml2.2 Run2.3 要执行的方法 3. Awakening 1. Jar 1.1 Pom.xml <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-co…