CMake实战(三)

简介: 前面两篇《CMake实战(一)》,《CMake实战(二)》,主要是介绍单目录和多目录的编译,接下来看一下自定义编译选项和交叉编译。

前言

前面两篇《CMake实战(一)》,《CMake实战(二)》,主要是介绍单目录和多目录的编译,接下来看一下自定义编译选项和交叉编译。


使用实例

下面源码在《CMake实战(二)》的基础上进行修改

(1) 修改main.c的内容如下:

#include<stdio.h>#include "hello.h"#include "config.h"intmain(void)
{
printHello();
#ifdef BUILD_CONFIG_FILEprintf("build config file test\r\n");
#endifreturn0;
}

(2) 修改根目录CMakeLists.txt, 内容如下:

#cmake最低版本需求,不加入此行会受到警告信息CMAKE_MINIMUM_REQUIRED(VERSION2.6)
PROJECT(HELLO) #项目名称# 加入一个配置头文件,用于处理 CMake 对源码的设置CONFIGURE_FILE(
"${PROJECT_SOURCE_DIR}/config.h.in""./config.h")
# 是否使用BUILD_CONFIG_FILE宏,默认开启OPTION(BUILD_CONFIG_FILE"build config test option"ON)
#把当前目录(.)下所有源代码文件加入变量SRC_LISTAUX_SOURCE_DIRECTORY(. SRC_LIST)
# 添加hello子目录ADD_SUBDIRECTORY(hello)
# 设置头文件查找目录INCLUDE_DIRECTORIES(./build/ ./hello)
#生成应用程序 mainADD_EXECUTABLE(main${SRC_LIST})
# 添加链接库, hello即子目录编译的库TARGET_LINK_LIBRARIES(mainhello)

就在原来的基础上新增CONFIGURE_FILE和OPTION。

(3) 添加config.h.in文件,内容如下:

#cmakedefine BUILD_CONFIG_FILE

目录结构如下:

2021021815103622.png

(4) 使用ccmake进行配置

cdbuildccmake ..

20210218151109601.png

按c进入配置

20210218151125804.png

然后出现上面的选项,然后再按c,就能配置了。

20210218151151497.png

按enter可以进行编辑,编辑完按g生成即可!生成的文件如下:

20210218151213703.png

这边我们没有使用cmake命令,而是使用ccmake这个工具,它是终端图形化的工具,而cmake是命令行工具。ccmake在选项配置上更友好!

(5) 编译执行

20210218151233964.png

(6) 交叉编译

要进行交叉编译只需要在CMakeLists.txt中加入下面配置:

#告知当前使用的是交叉编译方式,必须配置SET(CMAKE_SYSTEM_NAMELinux)
SET(TOOLCHAIN_DIR"/usr/bin")
# 交叉编译工具的位置set(CMAKE_CXX_COMPILER${TOOLCHAIN_DIR}/arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER${TOOLCHAIN_DIR}/arm-linux-gnueabihf-gcc)

总结

自定义编译选项和Autotools中的configure类似,用于配置需要的编译选项。而交叉编译也是比较常用的,毕竟是做嵌入式的嘛。CMake基本的内容就差不多了,更多深入的内容可以看官方文档。平时需要的时候再查文档即可。

相关文章
|
测试技术 网络架构
SFP与GBIC详解:探索两者的细微差别
【4月更文挑战第21天】
480 0
|
Oracle Java 关系型数据库
SpringBoot整合ELK做日志(超完整)(上)
SpringBoot整合ELK做日志(超完整)(上)
561 0
|
6月前
|
算法 搜索推荐 vr&ar
试衣间OUT!增强现实让购物更丝滑
试衣间OUT!增强现实让购物更丝滑
226 14
|
7月前
|
Serverless Python
借助 serverless 将 MCP 服务部署到云端
本文介绍了如何将 MCP 服务通过 SSE 协议部署到云端,避免本地下载和启动的麻烦。首先,使用 Python 实现了一个基于 FastMCP 的网络搜索工具,并通过设置 `transport='sse'` 启用 SSE 协议。接着,编写客户端代码测试服务功能,确保其正常运行。随后,利用阿里云函数计算服务(FC 3.0)以 Serverless 方式部署该服务,包括创建函数、配置环境变量、添加依赖层以及部署代码。最后,提供了客户端测试方法和日志排查技巧,并展示了如何在不同工具(如 Cherry-Studio、Cline 和 Cursor)中配置云端 MCP 服务。
1294 10
借助 serverless 将 MCP 服务部署到云端
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
484 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
STM32CubeMX FreeRTOS 互斥锁
STM32CubeMX FreeRTOS 互斥锁
568 12
|
网络协议
计算机网络四种帧介绍,广播帧、未知帧、同网帧、异网帧
计算机网络四种帧介绍,广播帧、未知帧、同网帧、异网帧
|
JSON Go UED
Go Web服务中如何优雅关机?
在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
196 1
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
301 1
|
存储 小程序 云计算
云计算概念与架构设计介绍
云计算概念与架构设计介绍