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

文章目录

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为例,安装的命令如下所示:

shell 复制代码
sudo apt install gcc g++ make

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

shell 复制代码
C:\Program Files (x86)\w64devkit

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

shell 复制代码
C:\Program Files (x86)\w64devkit\bin

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

2.2 安装CMake

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

shell 复制代码
sudo apt install cmake

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

3.编译一个示例程序

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

我们跟随这个步骤修改一个例子并运行试试:

首先我们修改CMakeLists.txt中的内容如下所示:

groovy 复制代码
# 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文件中的对应步骤内容:

cpp 复制代码
// 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.h

int main(int argc, char* argv[])
{
  if (argc < 2) {
    // TODO 12: Create a print statement using Tutorial_VERSION_MAJOR
    //          and Tutorial_VERSION_MINOR
    std::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 root
  const 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目录下,执行命令:

cpp 复制代码
cmake -G "MinGW Makefiles" ..

注意:后面的两个点不能忘掉,这两个点代表上一级目录,这里就是要指定CMakeLists.txt文件所在的目录。

执行成功界面如下:
此时我们刚才新建的build目录下会生成几个编译文件
这时我们再运行命令cmake --build . 生成可执行的文件,这里的点也不能忘记,这里的点代表当前目录.

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

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

新建一个系统环境变量,将参数配置上去:

保存后,我们直接使用命令:cmake .. 就可以编译C++ 项目了。

总结

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

相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos7 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室7 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0017 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我587 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc8 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很8 小时前
C++ 集合 list 使用
c++