C/C++跨平台构建工具CMake入门

文章目录

  • 1.概述
  • 2.环境准备
    • 2.1 安装编译工具
    • 2.2 安装CMake
  • 3.编译一个示例程序
  • 总结

1.概述

本人一直对OpenGL的3d渲染很感兴趣,但是苦于自己一直是Android开发,没有机会接触这方面的知识。就在最近吗,机会来了,以前一个做3D渲染的同事要离职,而公司暂时又招不到合适的人,而我懂点jni和C++,所以就先拉过来凑数了。但是一旦投入咱们就得好好的整一把。所以想先熟悉学习下Cmake的构建工具,因为接手到的项目jni部分使用CMake辅助构建的,所以学好Cmake构建工具是很有用的。而且渲染基本使用的都是C/C++,所以我觉得C/C++不能没有Cmake,就如Android不能没有Gradle.本文主要是介绍在windows上搭建CMake的构建环境并基于MinGW编译工具编译跑通一个C++程序,并且提供给读者学习CMake的方法。并鼓励读者那能够使用博客的方式将自己的理解记录下来,否则过一段时间就忘了,本文的最重要的目的也是防止自己忘掉。故记录一下。

2.环境准备

2.1 安装编译工具

如果咱们使用的是Linux学习CMake,需要先安装gcc,make工具,以Ubuntu为例,安装的命令如下所示:

sudo apt install gcc g++ make

本文所使用的环境是Windows所以我们也需要先安装编译工具,本文使用的MinGW工具。这个工具可以使我们像操作Linux那样在Windows的命令行为所欲为,下载地址为:MinGW工具下载地址 下载界面如下所示:
在这里插入图片描述下载完成后解压到你想放的目录:比如我放在了下面的路径:

C:\Program Files (x86)\w64devkit

然后,找到刚才解压文件的bin目录,我的是:

C:\Program Files (x86)\w64devkit\bin

配置到环境变量:
在这里插入图片描述配置完后打开命令行CMD验证下,是否成功,如下图所示:
在这里插入图片描述输入Linux命令ls 如果没有报错就表示配置成功了。

2.2 安装CMake

如果是Ubuntu,安装CMake只需要运行下面的命令即可:

sudo apt install cmake

假如我们使用的是windows,需要去CMake的官网下载安装包,CMake工具下载地址下载的页面如下:
在这里插入图片描述下载成功后点击安装,这里需要注意的是:当安装的引导页面中弹出选项时,为了方便,咱们需要勾选上下图中的选项,这个选项会将CMake工具添加到环境变量,方便我们全局使用
在这里插入图片描述安装完成后检验下是否安装成功,在cmd命令行输入命令: cmake --version
在这里插入图片描述如果能出现上图中的信息就表示Cmake工具配置成功了

3.编译一个示例程序

在CMake官网,其实给我们准备了练习CMake工具的练习题,我们只要下载下来,跟着官网文档一步步做就行了。CMake官网教程地址 ,我们打开这个地址页面如下所示:
在这里插入图片描述下载完解压后会得到一个目录,如下所示:
在这里插入图片描述每个Step就代表一个练习,例如打开Step1如下:
在这里插入图片描述这时候我们打开里面的CmakeLists.txt发现里面有一些步骤,我们只要按照这些步骤和官方文档操作,就能编译出我们想要的C/C++产物,文件打开后页面如下:

在这里插入图片描述

我们跟随这个步骤修改一个例子并运行试试:
首先我们修改CMakeLists.txt中的内容如下所示:

# TODO 1: Set the minimum required version of CMake to be 3.10
cmake_minimum_required(VERSION 3.10)
# TODO 2: Create a project named Tutorial
project(Tutorial)# TODO 7: Set the project version number as 1.0 in the above project command# TODO 6: Set the variable CMAKE_CXX_STANDARD to 11
#         and the variable CMAKE_CXX_STANDARD_REQUIRED to True
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# TODO 8: Use configure_file to configure and copy TutorialConfig.h.in to
#         TutorialConfig.h# TODO 3: Add an executable called Tutorial to the project
# Hint: Be sure to specify the source file as tutorial.cxx
add_executable(Tutorial tutorial.cxx)# TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}

然后我们修改tutorial.cxx文件中的对应步骤内容:

// A simple program that computes the square root of a number
#include <cmath>
//#include <cstdlib> // TODO 5: Remove this line
#include <iostream>
#include <string>// TODO 11: Include TutorialConfig.hint main(int argc, char* argv[])
{if (argc < 2) {// TODO 12: Create a print statement using Tutorial_VERSION_MAJOR//          and Tutorial_VERSION_MINORstd::cout << "Usage: " << argv[0] << " number" << std::endl;return 1;}// convert input to double// TODO 4: Replace atof(argv[1]) with std::stod(argv[1])const double inputValue = std::stod(argv[1]);// calculate square rootconst double outputValue = sqrt(inputValue);std::cout << "The square root of "<< inputValue << " is " << outputValue << std::endl;std::cout << "c++: " << __cplusplus << std::endl; // 新增代码打印C++版本return 0;
}

保存后退出,找到我们存放Step1的目录,在目录下新建一个build目录存放编译产物。
在这里插入图片描述然后在这个目录下打开命令行进入build目录下,执行命令:

cmake -G "MinGW Makefiles" ..

注意:后面的两个点不能忘掉,这两个点代表上一级目录,这里就是要指定CMakeLists.txt文件所在的目录。
执行成功界面如下:
在这里插入图片描述此时我们刚才新建的build目录下会生成几个编译文件
在这里插入图片描述这时我们再运行命令cmake --build . 生成可执行的文件,这里的点也不能忘记,这里的点代表当前目录.
在这里插入图片描述

执行完命令后我们会发现多了一个可执行的exe文件:
在这里插入图片描述我们可以运行这个可执行文件验证下结果:输入Tutorial.exe 100
在这里插入图片描述正确执行并输出了了C++ 中的程序想要输出的信息

补充说明: 上面编译Step1时,需要使用命令:cmake -G "MinGW Makefiles" .. 有读者可能会觉得这个命令比较难记,特别时后面一长串参数,为了解决这个问题,我们可以根据官方文档,配置一个环境变量,

在这里插入图片描述新建一个系统环境变量,将参数配置上去:
在这里插入图片描述
保存后,我们直接使用命令:cmake .. 就可以编译C++ 项目了。
在这里插入图片描述

总结

上面介绍的内容其实官网都详细的介绍了,这里之所以写一篇文章是因为我想加入自己的理解记录下我的学习过程,另外想给一些新手小伙伴一个学习CMake构建工具的方向和方法,建议读者多看官网的教程,博客只是做个辅助吧,主要看下如何入门就好了。有问题可以在评论区一起交流。

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

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

相关文章

【C/C++】C/C++面试八股

C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的&#xff1f;构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么&#xff1f;为什么要内存对齐static关键…

微信公众号网页授权登录获取用户基本信息

概述 微信公众号网页授权登录后微信获取用户基本信息&#xff0c;部署即可运行完整demo 详细 一、前言 &#xff08;1&#xff09;适合人群 1&#xff0c;JAVA服务端开发人员 2&#xff0c;初级人员开发人员 3&#xff0c;了解spring springboot maven 3&#xff0c;了…

k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD

测试环境使用的jenkins 正式环境使用的gitlab-ci 测试环境 创建yaml文件 apiVersion: v1 kind: ConfigMap metadata:name: dtk-go-tiktok-admin-configlabels:app.kubernetes.io/name: dtk-go-tiktok-adminapp.kubernetes.io/business: infrastructureapp.kubernetes.io/run…

中国312个历史文化名镇及景区空间点位数据集

一部中华史&#xff0c;既是人类创造丰富物质财富的奋头史&#xff0c;又是与自然共生共存的和谐史不仅留存下悠久丰富的人文思想和情怀&#xff0c;还在各处镌刻下可流传的生活场景&#xff0c;历史文化名镇(以下简称:名镇)就是这样真实的历史画卷。“镇”是一方的政治文化中心…

Elasticsearch:使用 Elasticsearch 进行语义搜索

在数字时代&#xff0c;搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语&#xff0c;期望搜索引擎返回与这些确切关键字匹配的结果。 虽然关键字搜索对于简化信息检索非常有价值&#xff0c;但它也有其局…

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …

【数据结构】——顺序表详解

大家好&#xff01;当我们学习了动态内存管理后&#xff0c;就可以写一个管理数据的顺序表了&#xff01;&#xff01;&#xff01; 顺序表的理解&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的一种…

青藏高原1-km分辨率生态环境质量变化数据集(2000-2020)

青藏高原平均海拔4000米以上&#xff0c;人口1300万&#xff0c;是亚洲九大河流的源头&#xff0c;为超过15亿人口提供淡水、食物和其他生态系统服务&#xff0c;被誉为地球第三极和亚洲水塔。然而&#xff0c;在该地区的人与自然的关系的研究是有限的&#xff0c;尤其是在精细…

高德地图根据两点的经纬度计算两点之间的距离(修正版)

SQL语句可以用来计算两个经纬度之间的距离。下面是一个示例的SQL语句&#xff1a; SELECT id, ( 6371 * ACOS( COS( RADIANS( lat1 ) ) * COS( RADIANS( lat2 ) ) * COS( RADIANS( lng2 ) - RADIANS( lng1 ) ) SIN( RADIANS( lat1 ) ) * SIN( RADIANS( lat2 ) ) ) ) AS dista…

PyTorch - 模型训练损失 (Loss) NaN 问题的解决方案

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133378367 在模型训练中&#xff0c;如果出现 NaN 的问题&#xff0c;严重影响 Loss 的反传过程&#xff0c;因此&#xff0c;需要加入一些微小值…

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群&#xff0c;开始。 前提条件&#xff0c;docker安装了docker-compose。如果没安装的话&#xff0c;参考这里 docker-compose文件参考bitnami官网&#xff1a;https://github.com/bitnami/contai…

巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq&#xff0c;kafka两种消息队列进行发送数据&#xff0c;为了避免硬编码&#xff0c;在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案&#xff0c;仅供参考&#xff01; 方案一&#xff1a;创建一个工具类&#xff0c;然后根据配置文…

Swift 周报 第三十八期

文章目录 前言新闻和社区苹果自研调制解调器芯片受挫&#xff1a;速度太慢容易过热&#xff0c;落后高通 3 年App Store 现已接受适用于最新版操作系统的 App 和游戏提交 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组…

vue 实现弹出菜单,解决鼠标点击其他区域的检测问题

弹出菜单应该具有的功能&#xff0c;当鼠标点击其他区域时&#xff0c;则关闭该菜单。 问题来了&#xff0c;怎么检测鼠标点击了其他区域而不是当前菜单&#xff1f; 百度“JS检测区域外的点击事件”&#xff0c;会发现有很多方法&#xff0c;有递归检测父元素&#xff0c;有遍…

Blender导出FBX给UE5

最近在学习UE5的资源导入&#xff0c;总结如下&#xff1a; 建模使用Blender&#xff0c;UE5版本是5.3 1.纯静态模型导入UE5 Blender FBX导出设置保持默认即可&#xff0c; UE5把导入设置里Miscellaneous下Force Front XAxis和Convert Scene Unit勾选即可 2.带骨骼动画的模型…

react项目优化

随着项目体积增大&#xff0c;打包的文件体积会越来越大&#xff0c;需要优化&#xff0c;原因无非就是引入的第三方插件比较大导致&#xff0c;下面我们先介绍如何分析各个文件占用体积的大小。 1.webpack-bundle-analyzer插件 如果是webpack作为打包工具的项目可以使用&…

MySQL 连接查询(多表查询 二)

基本介绍 作用&#xff1a;连接查询&#xff08;Join&#xff09;操作&#xff0c;用于联结多个表以获取更全面和准确的数据 基本分类&#xff1a; 内连接&#xff1a;相当于查询A、B交集部分数据&#xff08;去掉迪卡尔积无效组合&#xff09;外连接&#xff1a; 左外连接&…

lwIP 开发指南(下)

目录 NETCONN 编程接口简介netbuf 数据缓冲区netconn 连接结构netconn 编程API 函数 NETCONN 编程接口UDP 实验NETCONN 实现UDPNETCONN 接口的UDP 实验硬件设计软件设计下载验证 NETCONN 接口编程TCP 客户端实验NETCONN 实现TCP 客户端连接步骤NETCONN 接口的TCPClient 实验硬件…

freertos中函数调用和启动第一个任务(栈相关!!!!!!)

本内容仅就一些较难理解的点讲解&#xff0c;请结合其它文章实用 在函数调用时&#xff0c;m3的处理器使用r0-r3共四个寄存器传参&#xff0c;其余的使用栈传参。 但是&#xff0c;如果传入的参数是全局变量&#xff0c;则不需传参&#xff0c;因为全局变量在函数内部是可见的…

【算法练习Day8】 kmp算法找出字符串中第一个匹配项的下标反转字符串中的单词重复的子字符串

、​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 kmp算法找出字符串中第…