【CMake】CMake从入门到实战系列(十七)—— CMake添加环境检查


🔥博客简介:开了几个专栏,针对 Linux 和 rtos 系统,嵌入式开发和音视频开发,结合多年工作经验,跟大家分享交流嵌入式软硬件技术、音视频技术的干货。

✍️系列专栏:C/C++、Linux、rtos、嵌入式开发、流媒体、数据结构、网络协议、开源库、CMake、Makefile、架构设计模式等。


文章目录

一、前言

在使用CMake构建C/C++项目时,添加环境检查可以确保构建环境满足项目的需求,例如检查编译器版本、依赖库的存在、头文件和函数的存在等。CMake提供了一些内置的模块和命令来进行这些检查。以下是详细步骤和示例,说明如何在CMake中添加环境检查。

二、检查CMake版本

首先,可以确保使用的CMake版本满足项目的最低要求:

c 复制代码
cmake_minimum_required(VERSION 3.20)  # 设置最低要求的CMake版本

三、检查编译器

可以检查编译器及其版本是否满足要求:

c 复制代码
# 检查C编译器版本
if(CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0)
	message(FATAL_ERROR "Requires at least gcc 5.0")
endif()

四、检查依赖库

可以使用find_package命令来检查依赖库是否存在:

c 复制代码
# 查找libcurl库
find_package(CURL REQUIRED)

if(NOT CURL_FOUND)
    message(FATAL_ERROR "libcurl not found")
else()
    message(STATUS "Found libcurl: ${CURL_INCLUDE_DIRS}, ${CURL_LIBRARIES}")
endif()

要在Ubuntu上安装libcurl库,可以使用以下步骤:

1、打开终端。

2、运行以下命令更新软件包列表:

sudo apt update

3、运行以下命令安装libcurl库:

sudo apt install libcurl4-openssl-dev

这将安装libcurl库及其开发文件。

安装完成后,你可以使用libcurl库来编译和运行程序。

五、检查头文件和函数

可以使用check_include_file和check_function_exists命令来检查头文件和函数是否存在:

c 复制代码
include(CheckIncludeFile)
include(CheckFunctionExists)

# 检查头文件
check_include_file("stdio.h" HAVE_STDIO_H)
if(NOT HAVE_STDIO_H)
    message(FATAL_ERROR "stdio.h not found")
endif()

# 检查函数
check_function_exists("printf" HAVE_PRINTF)
if(NOT HAVE_PRINTF)
    message(FATAL_ERROR "printf function not found")
endif()

六、检查程序

可以使用find_program命令来检查某些程序是否存在:

c 复制代码
# 查找git程序
find_program(GIT_EXECUTABLE git)
if(NOT GIT_EXECUTABLE)
    message(FATAL_ERROR "git not found")
else()
    message(STATUS "Found git: ${GIT_EXECUTABLE}")
endif()

# 查找python3程序
find_program(PYTHON_EXECUTABLE python3)
if(NOT PYTHON_EXECUTABLE)
    message(FATAL_ERROR "python3 not found")
else()
    message(STATUS "Found python3: ${PYTHON_EXECUTABLE}")
endif()

七、自定义检查

可以编写自定义的CMake脚本进行更复杂的检查。例如,检查某个环境变量是否设置:

c 复制代码
# 自定义检查
if(NOT DEFINED ENV{MY_ENV_VAR})
	message(STATUS "Environment variable MY_ENV_VAR is not set")
endif()

八、完整示例

目录结构

bash 复制代码
project/
├── CMakeLists.txt
├── main.c

CMakeLists.txt源码

c 复制代码
include(CheckIncludeFile)
include(CheckFunctionExists)

# 设置最低要求的CMake版本
cmake_minimum_required(VERSION 3.20)
project(Demo)

# 检查C编译器版本
if(CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0)
	message(FATAL_ERROR "Requires at least gcc 5.0")
endif()

# 查找libcurl库
find_package(CURL REQUIRED)

if(NOT CURL_FOUND)
    message(FATAL_ERROR "libcurl not found")
else()
    message(STATUS "Found libcurl: ${CURL_INCLUDE_DIRS}, ${CURL_LIBRARIES}")
endif()

# 检查头文件
check_include_file("stdio.h" HAVE_STDIO_H)
if(NOT HAVE_STDIO_H)
    message(FATAL_ERROR "stdio.h not found")
endif()

# 检查函数
check_function_exists("printf" HAVE_PRINTF)
if(NOT HAVE_PRINTF)
    message(FATAL_ERROR "printf function not found")
endif()

# 查找git程序
find_program(GIT_EXECUTABLE git)
if(NOT GIT_EXECUTABLE)
    message(FATAL_ERROR "git not found")
else()
    message(STATUS "Found git: ${GIT_EXECUTABLE}")
endif()

# 查找python3程序
find_program(PYTHON_EXECUTABLE python3)
if(NOT PYTHON_EXECUTABLE)
    message(FATAL_ERROR "python3 not found")
else()
    message(STATUS "Found python3: ${PYTHON_EXECUTABLE}")
endif()

# 自定义检查
if(NOT DEFINED ENV{MY_ENV_VAR})
	message(STATUS "Environment variable MY_ENV_VAR is not set")
endif()

add_executable(app main.c)

main.c源码

c 复制代码
#include <stdio.h>

int main(void)
{
    printf("hello world\n");
    return 0 ;
}

编译运行

ubuntu上编译运行,project目录执行命令

bash 复制代码
mkdir build
cd build
cmake ..
make

结果:

该专栏下一篇文章我们总结CMake中所有查找指令。

相关推荐
杨云龙UP8 分钟前
Oracle ASM磁盘组空间分配与冗余理解
linux·运维·数据库·sql·oracle
朽棘不雕20 分钟前
Linux权限
linux
智链RFID26 分钟前
从需求到落地:企业RFID系统选择的智慧之道
物联网·rfid·数字化转型·企业信息化·仓储管理
minji...31 分钟前
Linux 库制作与原理(三)深入动静态链接原理
linux·运维·服务器·c++
bukeyiwanshui1 小时前
Linux实践
linux·运维·服务器
xlp666hub1 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·面试
RFID科技的魅力1 小时前
零门槛上手!CP300R触屏RFID打印机操作体验与打印效果实测
大数据·物联网·rfid
守望时空331 小时前
使用NetworkManager替换当前网络管理器
linux·运维
计算机安禾2 小时前
【C语言程序设计】第35篇:文件的打开、关闭与读写操作
c语言·开发语言·c++·vscode·算法·visual studio code·visual studio
爱网安的monkey brother2 小时前
Linux自用文档
linux