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构建工具的方向和方法,建议读者多看官网的教程,博客只是做个辅助吧,主要看下如何入门就好了。有问题可以在评论区一起交流。
相关文章:
C/C++跨平台构建工具CMake入门
文章目录 1.概述2.环境准备2.1 安装编译工具2.2 安装CMake 3.编译一个示例程序总结 1.概述 本人一直对OpenGL的3d渲染很感兴趣,但是苦于自己一直是Android开发,没有机会接触这方面的知识。就在最近吗,机会来了,以前一个做3D渲染的…...
【CFD小工坊】浅水方程的离散及求解方法
【CFD小工坊】浅水方程的离散及求解方法 前言基于有限体积法的方程离散界面通量与源项计算干-湿网格的处理数值离散的稳定性条件参考文献 前言 我们模型的控制方程,即浅水方程组的表达式如下: ∂ U ∂ t ∂ E ( U ) ∂ x ∂ G ( U ) ∂ y S ( U ) U…...
第十四章 类和对象——C++对象模型和this指针
一、成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 class Person {public:Person() {mA 0;}//非静态成员变量占对象空间int mA;//静态成员变量不占对象空间static int mB; //函数也不占对象空间&#…...
计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…...
java web+Mysql e-life智能生活小区物业管理系统
本项目为本人自己书写,主要服务小区业主和管理人员。 e-life智能生活小区涉及多个方面的智能化和便利化服务: 1. 用户模块:包含基本的登入登出操作,查看个人信息中用户可以查看 自己的个人资料但不可以修改个人信息。 a) 用户…...
AttributeError: module ‘dgl‘ has no attribute ‘batch_hetero‘
DGLWarning: From v0.5, DGLHeteroGraph is merged into DGLGraph. You can safely replace dgl.batch_hetero with dgl.batch...
Vue项目搭建图文详解教程
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 预备工作 请在本地创建文件夹用于存放Vue项目,例如:创建HelloWorld文件夹存放即将创建的Vue新项目。 创建Vue项目 首先,请在DOS中将目录…...
SpringMVC处理请求核心流程
一、前言 SpringMVC是一个基于Java的Web框架,它使用MVC(Model-View-Controller)设计模式来处理Web请求。在SpringMVC中,请求处理的核心流程主要包括以下几个步骤: 1、用户发送请求到前端控制器(Dispatche…...
SoloX:Android和iOS性能数据的实时采集工具
SoloX:Android和iOS性能数据的实时采集工具 github地址:https://github.com/smart-test-ti/SoloX 最新版本:V2.7.6 一、SoloX简介 SoloX是开源的Android/iOS性能数据的实时采集工具,目前主要功能特点: 无需ROOT/越狱…...
【知识点随笔分析 | 第五篇】简单介绍什么是QUIC
前言: 随着互联网的快速发展,传统的基于TCP的协议开始显现出一些局限性。TCP在连接建立和拥塞控制方面存在一定的延迟,这可能导致用户在访问网页、观看视频或玩网络游戏时感受到不必要的等待时间。而QUIC作为一种新兴的传输协议,试…...
vscode ssh 远程免密登录开发
存放代码的机器运行 sshd, vscode 所在机器保证可以通过 ssh 登录服务器vscode 机器通过 ssh-keygen 生成 ssh 公私钥对(已有可以忽略)将客户端的 id_rsa.pub 加入到服务器的鉴权队列 cat id_rsa.pub >> authorized_keysvscode 配置ssh登录即可.ctrlp, remote-ssh: open …...
辅助驾驶功能开发-测试篇(2)-真值系统介绍
1 真值系统概述 1.1 真值评测系统核心应用 快速构建有效感知真值,快速完成感知性能评估,快速分析感知性能缺陷。 主要应用场景包括: 1. 感知算法开发验证: 在算法开发周期中,评测结果可以作为测试报告的一部分,体现算法性能的提升。 2. 遴选供应…...
运行程序时msvcr110.dll丢失的解决方法,msvcr110.dll丢失5的个详细解决方法
在使用电脑的过程中,我们经常会遇到各种问题,其中之一就是 msvcr110.dll 丢失的问题。msvcr110.dll 是 Microsoft Visual C Redistributable 的一个组件,用于支持使用 Visual C 编写的应用程序。如果您的系统中丢失了这个文件,您可…...
已解决 Bug——IndexError: index 3 is out of bounds for axis 0 with size 3问题
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...
WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作
好 在我们的不懈努力之下 交易所中的三种订单函数已经写出来了 但是 我们只是编译 确认了 代码没什么问题 但还没有实际的测试过 这个测试做起来 其实就比较的麻烦了 首先要有两个账号 且他们都要在交易所中有存入 我们还是先将 ganache 的虚拟环境启动起来 然后 我们在项目…...
c++-vector
文章目录 前言一、vector介绍二、vector使用1、构造函数2、vector 元素访问3、vector iterator 的使用4、vector 空间增长问题5、vector 增删查改6、理解vector<vector< int >>7、电话号码的字母组合练习题 三、模拟实现vector1、查看STL库源码中怎样实现的vector2…...
十四天学会C++之第二天(函数和库)
1. 函数的定义和调用 在C中,函数是组织和结构化代码的关键工具之一。它们允许您将一段代码封装成一个可重复使用的模块,这有助于提高代码的可读性和维护性。 为什么使用函数? 函数在编程中的作用不可小觑。它们有以下几个重要用途…...
蓝桥杯每日一题2023.10.3
杨辉三角形 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 40分写法: 可以自己手动构造一个杨辉三角,然后进行循环,用cnt记录下循环数的个数,看哪个数与要找的数一样,输出cnt #include<bits/stdc.h> using na…...
JavaScript系列从入门到精通系列第十二篇:JavaScript中对象的简介和对象的基本操作以及JavaScript中的属性值和属性名
文章目录 前言 一:对象分类 1:内建对象 2:宿主对象 3:自建对象 二:对象的基本操作 1:创建对象 2:向对象中添加属性 3:读取对象中的属性 4:修改对象中的属性 三…...
OpenCV实现视频的追踪(meanshift、Camshift)
目录 1,meanshift 1.1 算法流程 1.2 算法实现 1.3 代码实现 1.4 结果展示 1,meanshift 1.1 算法流程 1.2 算法实现 1.3 代码实现 import numpy as np import cv2 as cv# 读取视频 cap cv.VideoCapture(video.mp4)# 检查视频是否成功打开 if n…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
作为点的对象CenterNet论文阅读
摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表,并对每一个位置进行分类。这种做法既浪费又低效,并且需要额外的后处理。在本文中,我们采取了不同的方法。我们将物体建模为单…...
【Vue】scoped+组件通信+props校验
【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性, 令样式只作用于当前组件的标签 作用:防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...
华为OD机考- 简单的自动曝光/平均像素
import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…...
【R语言编程——数据调用】
这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中,有多个库支持调用内置数据集或外部数据,包括studentdata等教学或示例数据集。以下是常见的库和方法: 可用库及数据集 openintro库 该库包含多个教学数据集&a…...
STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...

