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

news2024/11/26 19:58:21

一.  简介

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

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

本文学习针对单个 .c源文件,cmake工具是如何编译的?

二.  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 文件中内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1639324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA面试题---WEB部分

网络通讯 TCP与UDP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、 可靠的、 基于 IP 的传输层协议。 UDP 是 User Datagram Protocol 的简称&#xff0c;中文名是用户数据报协议&#xff0c;是 OSI 参考模 型中的传输层协议&#xff0c;它是…

基于光伏电站真实数据集的深度学习预测模型(Python代码,深度学习五个模型)

效果视频链接&#xff1a;基于深度学习光伏预测系统&#xff08;五个模型&#xff09;_哔哩哔哩_bilibili 界面设计 注册界面 登录界面 主界面 展示界面 1.数据集来源 The SOLETE dataset 这里分别保存了不同间隔采样时间表格 1min是以1min 间隔采集的数据集 数据集截图&…

分享自己一篇在亚马逊云科技AWS官网发的Blog技术文章

小李哥在亚马逊AWS官网&#xff0c;作为第一作者发了自己的第一篇AWS Blog文章&#xff0c;也是自己今年在AWS官网的第11篇文章。文章主要内容是描述为出海的金融企业&#xff0c;搭建满足PCI-DSS合规、FIPS 140-2 Level 3安全标准的传输中数据加密云端方案&#xff0c;主要用于…

云服务器平台Featurize--基本使用步骤与使用感受

基本介绍 图1 网址&#xff1a;Featurize 可租用实例的显示界面如图所示。 图2 在简单的注册、登录、充值之后就可以对想要的实例直接进行租赁了。 关于实例&#xff0c;这里我的理解是已经配置好一定环境的服务器。 图3 使用感受 总结一下&#xff0c;Featurize上云服务器的…

【经典算法】LeetCode112. 路径总和(Java/C/Python3/Go实现含注释说明,Easy)

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…

Agent AI智能体:如何借助机器学习引领科技新潮流

文章目录 &#x1f4d1;前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 &#x1f4d1;前言…

004 秒杀下单

文章目录 超卖问题方案一方案二方案三aop锁(单机锁)aop锁(单机锁)pom.xmlLockAspect.javaServiceLock.java 分布式锁Mysql分布式锁Redis分布式锁ServiceRedisLock.javaLockRedisAspect.java 下单性能优化数据一致性解决一致性问题异步同步库存 秒杀下单业务步骤: 1.数据校验(身…

DS:顺序表、单链表的相关OJ题训练

欢迎各位来到 Harper.Lee 的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu可以来后台找我交流哦&#xff01; 在DS&#xff1a;单链表的实现 和 DS&#xff1a;顺序表的实现这两篇文章中&#xff0c;我详细介绍了顺序表和单链表的…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

Photoshop前言

Photoshop前言 分辨率图像格式工具界面组件 分辨率 分辨率是指单位长度内包含的像素点的数量&#xff0c;其单位通常为像素/英寸&#xff08;ppi&#xff09;&#xff0c;300ppi表示每英寸包含300个像素点。对于1英寸1英寸大小的图像&#xff0c;若分辨率为72ppi&#xff0c;则…

Unity MeshRenderer 入门

概述 在项目制作过程中&#xff0c;肯定缺少不了模型的使用&#xff0c;那就一定接触过MeshRenderer&#xff0c;也许还有你不理解的地方&#xff0c;接下来让我们来学习一下这部分的内容吧。 Mesh Filter&#xff08;网格过滤器&#xff09; Mesh:提供一个网格的参考&#xf…

# notepad++ 编辑器英文版,如何打开自动换行

notepad 编辑器英文版&#xff0c;如何打开自动换行 在Notepad中&#xff0c;如果你想要开启自动换行功能&#xff0c;可以按照以下步骤操作&#xff1a; 1、打开 Notepad 编辑器。 1.1. 依次点击菜单栏中的【视图】&#xff0c;英文版对应【View】。1.2. 在【视图】下拉菜单…

Integer中的缓存机制

先看一个示例&#xff1a; public static void main(String[] args) {Integer a127;Integer b127;System.out.println(ab);Integer c128;Integer d128;System.out.println(cd);} 输出&#xff1a; true false 为什么明明都是同一个数字进行比较&#xff0c;当数字等于127的…

串口单线半双工转换电路

用来把单线半双工模式的串口转换成双线&#xff0c;然后才能连接到普通的双线USB 串口模块&#xff0c;比如CH340 之类的。电路设计来自大佬的博客&#xff1a;AVR half-duplex software UART supporting single pin operation。他在Arduino 上用软件模拟串口功能&#xff0c;利…

【火猫DOTA2】电竞世界杯DOTA2项目将在7月份的前三周举办

1、电竞世界杯将于今年7月3日至8月25日在沙特利雅得举办。近日主办方公布了各个项目的举办时间,其中DOTA2项目将在7月份的前三周举办。转载:火猫TV资讯https://www.huomaotv.com/ 目前Falcons、XG、GG和Liquid这五支赢得了足够EPT积分的队伍已经确定直邀沙特。剩下的三个名额还…

nginx的前世今生(二)

书接上回&#xff1a; 上回书说到&#xff0c;nginx的前世今生&#xff0c;这回我们继续说 3.缓冲秘籍&#xff0c;洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一&#xff0c;主要用于暂存和管理进出的数据流&#xff0c;以应对不同组件间速度不匹配的问题…

图片高效批量美化,支持将图片进行旋转180度并生成浴室玻璃图片,让图片瞬间焕然一新!

图片已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;一张张手动美化图片却是一项既耗时又耗力的任务。为了帮助您轻松应对这一挑战&#xff0c;我们推出了一款高效批量美化图片的工具&#xff0c;并支持将图片旋转180度及生成浴室玻璃效果&#xff0c;让您的图片瞬间…

安装英伟达nvidia p4计算卡驱动@FreeBSD14

FreeBSD也能跑cuda AI训练拉&#xff01; 在FreeBSD安装好pytorch和飞桨cpu版本后&#xff0c;尝试安装英伟达nvidia p4计算卡驱动。毕竟全靠cpu速度太慢了&#xff0c;还是GPU快啊&#xff01;在磕磕绊绊几天后&#xff0c;终于成功成功安装好nvidia p4的cuda驱动&#xff0c…

拆单算法交易(Algorithmic Trading)

TWAP TWAP交易时间加权平均价格Time Weighted Average Price 模型&#xff0c;是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时间进行均匀分割&#xff0c;并在每个分割节点上将拆分的订单进行提交。例如&#xff0c;可以将某个交易日的交易时间平均分为N 段&am…

密码学基础练习五道 RSA、elgamal、elgamal数字签名、DSA数字签名、有限域(GF)上的四则运算

1.RSA #include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>#define PRIME_MAX 200 //生成素数范围#define EXPONENT_MAX 200 //生成指数e范围#define Element_Max 127 //加密单元的…