【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中所有查找指令。

相关推荐
momo卡18 分钟前
MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
c语言·c++·windows
jugt1 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
超的小宝贝1 小时前
数据结构算法(C语言)
c语言·数据结构·算法
多多*2 小时前
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
linux·开发语言·redis·python·bootstrap·lua
何双新3 小时前
第21讲、Odoo 18 配置机制详解
linux·python·开源
21号 13 小时前
9.进程间通信
linux·运维·服务器
凤年徐3 小时前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
CodeCraft Studio6 小时前
【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台
javascript·物联网·ui
___波子 Pro Max.8 小时前
CMake GLOB返回路径规则及示例
cmake
华奥系科技9 小时前
智慧水务发展迅猛:从物联网架构到AIoT系统的跨越式升级
人工智能·物联网·智慧城市