业务需要用到CMake和gtest框架,但我此前从来没接触过,就花时间整理了下,做了一个简单的cmake尝试。

前言

我过去使用Java语言,就算用C++也是Dev C++ IDE,很少关注编译与构建的细节。只是大概知道:

  • C++是编译型语言。cpp代码文件需要由编译器编译成exe二进制文件才能执行
  • Java是编译解释性语言。java代码文件需要先编译成class文件,再由解释器放在jvm虚拟机里运行。

花时间学习CMake确实有助于我理解很多底层的知识,特别是理解很多细节,这个教程会持续下去,但不一定每周都更新。

准备工作

语法知识放一边,先来安装CMake和gcc。(以下的安装基于Windows)

gcc

如果你电脑已经安装了Dev C++或者Visual Studio,你大概率有一个gcc在电脑里。

使用以下代码检查电脑的gcc环境:gcc -v

你应该能看出来,我电脑的gcc用的是新版Dev C++自带的 9.2.0,我电脑同时安装了VS 2022,这给我带来了不少麻烦,会在以后的教程里提及。

这个版本的Dev C++是国内作者的改版,链接:小龙 Dev-C++ 中文主页

如果你的电脑有MinGW环境

添加环境变量即可,以我的为例,Dev C++自带的gcc在以下位置:D:\Program Files (x86)\Dev-Cpp\TDM-GCC-64,这个目录下应该包含bin、include、lib等文件夹。

在环境变量-系统变量-Path里,加入bin文件夹所在的路径,如图:

如果你的电脑没有MinGW环境

下载地址:MinGW

install,一路next。安装成功后打开MinGW Installation Manager,选择需要安装的版本(如果你不知道需要哪些就全选),点击菜单栏的Installation,点击Apply Changes,在弹出的对话框里点击Apply,然后等待安装完成即可。

然后按照上面的配置环境变量。

顺便科普一下TDM-GCC和MinGW的信息

MinGW: 编译目标仅兼容 32 位应用程序,最新的官方二进制版本为 GCC 9.2.0。(OSDN)

MinGW-w64: 衍生自 MinGW 的项目,编译目标兼容 32 位应用程序与64 位应用程序,最新的官方二进制版本为 GCC 8.1.0。(SourceForge)

TDM-GCC: 衍生自 MinGW 和 MinGW-w64 的项目,分为 32 位与 64 位两个版本,32 位版本的编译目标仅兼容 32 位应用程序,64位版本的编译目标兼容 32 位应用程序与 64 位应用程序,最新的官方二进制版本为 GCC 10.3.0。

CMake

下载地址:Download | CMake

选择Windows x64的msi安装包,如下一路安装即可,记得为所有用户安装,以及配置path。

在PowerShell输入cmake --version以检查CMake是否安装成功,如图

从Helloworld开始

CMake

简单来说,gcc的确可以将源文件编译成exe文件,但文件一多,就需要一个编译顺序,利用构建(build)可以指定这种顺序,定义构建的文件被称为Makefile。

但是编写Makefile对于大型项目又比较复杂,通过CMake就可以使用更加简洁的语法定义构建的流程,CMake定义构建过程的文件为CMakeLists.txt。

cmake的一般流程为:

  1. 生成构建系统,对应的指令为cmake
  2. 构建,对应的指令为cmake --build
  3. 其他操作,比如执行、测试等。

一个非常简单的例子

这个例子简单到,实际生产的时候,是绝对不会用这样的结构的。

目录结构如下:

cmakeTest
├─ CMakeLists.txt
└─ main.cpp

main.cpp的代码如下。就是输出hello cmake,没什么意义。

#include<cstdio>using namespace std;int main(){printf("Hello CMake!");
}

CMakeLists.txt的结构比较重要:

# 项目所需最低Cmake版本
cmake_minimum_required(VERSION 3.12)# 项目名称、版本、语言
project(cmaketest VERSION 1.0.0 LANGUAGES C CXX)# 源文件与可执行文件
add_executable(helloc main.cpp)

生成构建系统

在项目根目录下执行

cmake -B build

结果如下:

很奇怪,这里用的是 VS 2022 的构建,没有用gcc的,这个问题留待以后解决,目前暂时保持现状不动。

构建

同样在根目录,执行

cmake --build build

执行

可能由于使用 VS 的原因,我的可执行文件并没有在根目录生成。你可以自己寻找位置,这太奇怪了。

【Cmake】初识CMake(一)相关推荐

  1. 初识CMake,如何编写一个CMake工程(上)

    如何编写一个CMake工程 笔者想分享CMake工程的原因? 1 接触CMake 1.1 认识CMake被广泛的使用? 1.2 了解CMake运行流程 1.3 Make和Makefile是什么关系? ...

  2. 初识CMake,如何编写一个CMake工程(下)

    如何编写一个CMake工程 上文分析了针对一个源文件.多个源文件.多个目录的情况 1 CMake自定义编译选项Demo4 1.1 效果展示 2 CMake安装(make install)与测试(mak ...

  3. CMake基础 第1节 初识CMake

    介绍# 本节展示一个非常基本的hello world的例子. 本节中的文件如下: A-hello-cmake$ tree . ├── CMakeLists.txt ├── main.cpp [CMak ...

  4. CMake Error: CMake was unable to find a build program corresponding to Ninja.

    系统环境: $ lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:g ...

  5. linux下cmake命令行,深入理解CMake(1): CMake命令行参数

    初衷 CMake能用来编写跨平台(cross-platform)的构建规则,通过这些规则来调用各个平台的编译器.链接器,生成各个目标(静态库,静态库,或者可执行). 我第一个接触的大型C++项目是Op ...

  6. 【已解决】CMake Error: Cannot determine link language for target “xxx“. CMake Error: CMake can not determ

    报错: CMake Error: Cannot determine link language for target "CMakeLists". CMake Error: CMak ...

  7. Could not find a package,configuration file provided by G2O ,G2OConfig.cmake,g2o-config.cmake

    因为项目需要使用到g2o,所以自己从git上面clone下来, git clone https://github.com/RainerKuemmerle/g2o.git 然后: cd g2o mkdi ...

  8. vs2017 cmake android,CMake构建VS2017工程

    1 安装VS2017/cmake 2 工程开发 3 生成VS2017工程 4 参考资料 1 安装VS2017/cmake 软件安装: Visual Studio官网下载Visual Studio Co ...

  9. CMake Error at cmake/boost.cmake:76 (MESSAGE)

    在源码安装mysql5.7系列时,出现如下错误: 错误现象: CMake Error at cmake/boost.cmake:76 (MESSAGE): You can download it wi ...

  10. linux用cmake编译,CMake使用简介(forLinux)

    cmake [选项] cmake [选项] 因为source 目录在../  所以指定../为源码目录. -G:指定构建系统,当前只想创建Linux/Unix系统标准Makefile.所以指定为Uni ...

最新文章

  1. ListView 添加头部 和尾部 布局 (addHeaderView 和 addFooterView)
  2. 区块链基础--工作量证明
  3. 页面转发后文本显示???_使用Divi的滑动动画显示过程的进度
  4. datagridview如何将sqlite实现多表查询_服气!月薪3W的Exceler,居然是这样合并多表数据的...
  5. 小伙工资单被同事看到后遭开除!网友炸锅了 最新后续来了...
  6. 查询SQL Server中表占用的空间方法
  7. IdentityServer4 中文文档与实战
  8. DirectX11 SDK 例程报错解决方法
  9. 【笔记】【机器学习基础】非负矩阵分解
  10. IP地址的定义与分类
  11. 开源 5k star 的定时任务管理系统,我爱了!
  12. Java 打印 Excel 表格
  13. C++与QML混合编程
  14. 01 - Empire Lupin One
  15. PHP 获取当前访问的URL
  16. 离散数学8.2.4主析取范式
  17. android nfc驱动,Android NFC 简单梳理
  18. 计算机国二大连考点,CFA一二三级的大连考点是在哪!
  19. 游戏策划学习:未知性与好奇心
  20. VIP邮箱收费多少钱?怎么注册申请163邮箱呢?步骤详解

热门文章

  1. 读电子书微习惯的养成
  2. mixly编程怎样音乐_使用mixly和Arduino结合蜂鸣器播放音乐
  3. Source Insight使用教程(一):导入工程
  4. 好看的404,500页面
  5. 02论文分享与分析——基于ROS的移动机械臂底层规划及运动仿真
  6. Problem G: 规范序排列
  7. 怎么把cad做的图分享给别人_怎么将CAD图转换
  8. 《python编程从入门到实践》第2版 第四章课后练习
  9. Lucene入门教程及java实现
  10. 我的世界服务器货币充值系统,《我的世界》中国版正式开启了充值功能