cmake的使用方法:单个源文件的编译

2024-05-02 19:04

本文主要是介绍cmake的使用方法:单个源文件的编译,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.  简介

经过前一篇文章的学习,针对不同平台下编译 .c工程时,为了不用针对不同平台编写(不同标准,不同规范)Makefile文件,提出了 cmake工具,cmake可以解决跨平台编译的问题。

cmake 就是针对这个问题所诞生,允许开发者编写一种与平台无关的 CMakeLists.txt 文件来制定整个工程的编译流程,再根据具体的编译平台,生成本地化的 Makefile 和工程文件,最后执行 make 编译。

二.  Linux系统下安装 cmake工具

cmake 就是一个工具命令,在 Ubuntu 系统下通过 apt-get 命令可以在线安装,输入如下命令进行安装:
sudo apt-get install cmake

输入 "cmake --version" 命令可以查看cmake工具是否安装:

可以看出,当前系统安装的 cmake 对应的版本号为 3.16.3 cmake 工具版本更新也是比较快的,从官 https://cmake.org/ 可知, cmake 最新版本为 3.22.0 ,不过这都没关系,其实使用哪个版本都是可以的,差 别并不会太大,所以这个大家不用担心。

三. cmake的使用方法:单个源文件的编译

安装完 cmake 工具之后,接着我们就来学习如何去使用 cmake cmake 官方也给大家提供相应教程,链接地址如下所示:
https://cmake.org/documentation/ //文档总链接地址
https://cmake.org/cmake/help/latest/guide/tutorial/index.html //培训教程
如果大家自学能力强,完全可以参考官方提供的培训教程学习 cmake ;对于 cmake 的学习,笔者给大家
两个建议:
1. 从简单开始、再到复杂!
2.  重点是自己动手多练习。
接下来从一个非常简单的示例开始向大家介绍如何使用 cmake ,再从这个示例进一步扩展、提出 更多需求,来看看 cmake 如何去满足这些需求。
单个源文件的程序通常是最简单的,一个经典的 C 程序“ Hello World ”,如何用 cmake 来进行构建呢?

1.  源码文件 main.c

#include <stdio.h>int main(int argc, char argv[])
{printf("Hello World!\n");return 0;
}

2.  创建 一个 CMakeLists.txt文件

现在我们需要新建一个 CMakeLists.txt 文件, CMakeLists.txt 文件会被 cmake 工具解析,就好比是 Makefile 文件会被 make 工具解析一样; CMakeLists.txt 创建完成之后,在文件中写入如下内容:
project(HELLO)
add_executable(hello ./main.c)

写入完成之后,保存退出,当前工程目录结构如下所示:
在我们的工程目录下有两个文件,源文件 main.c CMakeLists.txt
接着我们在工程目录下直接执行 cmake 命令,如下所示:
cmake ./
cmake 后面携带的路径指定了 CMakeLists.txt 文件的所在路径,执行结果如下所示:
执行完 cmake 之后,除了源文件 main.c CMakeLists.txt 之外,可以看到当前目录下生成了很多其它的文件或文件夹,包括: CMakeCache.txt CmakeFiles cmake_install.cmake Makefile
重点是生成了这个 Makefile 文件,有了 Makefile 之后,接着我们使用 make 工具编译我们的工程,输入 make命令进行编译:
通过 make 编译之后得到了一个可执行文件 hello ,这个名字是在 CMakeLists.txt 文件中指定的,稍后向大家介绍。
通过 file 命令可以查看到 hello 是一个 x86-64 架构下的可执行文件,所以只能在我们的 Ubuntu PC 上运行:
为了验证 hello 可执行文件运行结果是否与源代码相同,我们直接在 Ubuntu 下运行即可,如下所示:
上面我们通过了一个非常简单例子向大家演示了如何使用 cmake ,重点在于去编写一个 CMakeLists.txt文件,接下来分析一下 CMakeLists.txt 文件中内容。

这篇关于cmake的使用方法:单个源文件的编译的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954955

相关文章

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位