MacOS CMake 简单入门

CMake的安装配置

安装 https://cmake.org/download/

配置命令行
安装完成后打开程序,在菜单栏Tools选项里选择How to install For Command Line Use提供3种配置方式;这里使用第1种方式,写到环境变量里,然后执行cmake –version显示如下表示配置正常


CMake简介

CMake是一个开源的跨平台构建工具,可以对代码进行编译、测试及打包操作。

CMake名字是“cross platform make”的缩写。Make工具里面比较出名的有GNU Make,QT 的qmake,微软的MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。因此CMake应运而生,它可以让程序员通过一个与开发平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的Makefile和工程文件

在 linux平台下使用CMake生成 Makefile并编译的流程如下:

  1. CmakeLists.txt。
  2. 命令“cmake PATH”或者“ccmake PATH”生成 Makefile( PATH是 CMakeLists.txt所在的目录 )。
  3. make命令进行编译。

CMake语法规则

CMake 通过 CMakeLists.txt文件来产生特定平台的标准的构建文件,CMakeLists.txt 的语法比较简单,由 命令、注释 和 空格 组成。命令可以是一个内置命令(如project),也可以是一个用户定义的宏(macro)或者函数(function)。

  • CMake 的指令大小写都可以,但变量大小写是有区分的,使用${}对进行变量的引用,在 IF 等语句中,是直接使用变量名而不通过${}取值
  • CMake 指令的参数使用括弧括起,参数之间使用空格或分号分开
  • Cmake 支持正则表达式

VSCode + CMake 简单使用

安装VSCode后,安装C++相关插件:C++, CMake, CMake Tools。

  1. mkdir cmake-helloworld,并使用VSCode打开;
  2. 按F1 或 Command + Shift + P,选择CMake:Quick Start即可创建一个CMake工程;

    我电脑是M1平台,这里选择第3个Clang即可


    接着输入名称创建project


    project生成完成
  3. 运行
    左侧栏切换到CMake工具目录,右键在终端中运行,即可看到结果

    或者cd到build目录,直接执行可执行文件,也可以看到结果

LLVM/Clang/GCC

LLVM是什么?

LLVM(Low Level Virtual Machine)是一个底层虚拟机,LLVM曾经有一部分功能对虚拟机有所帮助。
但是现在,LLVM所代表的基本和虚拟机没有关系了,也不再作为一个缩写使用了,而是直接作为一个名字使用。

那么LLVM到底是什么?

LLVM可以被看作是一系列的编译器和工具链技术的集合,而且它们是模块化并且是可重用的。这是LLVM官方的解释。
原话是:
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
(官方定义永远是准确精练的)

LLVM是一个编译器;
LLVM是一个编译器框架;
LLVM是一系列的编译器工具;
LLVM是一个编译器工具链;
LLVM是一个C++实现的开源软件;

这几种对LLVM的理解都对,但是也都是LLVM的一个方面,综合起来就是一个完整的LLVM。
所以,从狭义上来说,可以把LLVM理解为一个编译器,但是这个编译器可不仅仅是个编译器,它包含了编译相关的各种工具链,并且有一些相对独立的工具,而且它还是开源的。关键一点LLVM是搞编译的,跟虚拟机已经完全没关系了。

Clang是什么?

Clang是一个C、C++、OC语言的轻量级编译器。
Clang由Apple公司开发,源代码授权使用BSD的开源授权。
Clang是由C++编写,基于LLVM,发布于LLVM BSD许可证下的编译器。
它与GNU C语言规范几乎完全兼容,并增加了额外的特性。

GCC是什么?

GNU 编译器套件(GNU Compiler Collection),简称为 GCC,是一组编译器和开发工具组合,可用于 Linux、Windows、多种 BSD 以及其他操作系统。几乎所有的 Linux 发行版都预装了 GCC。

GCC 是一个工具链,用于编译代码,将代码与各种库依赖项连接,并为程序集,最后形成可执行文件。使用 GCC 进行编译的过程很简单,比如:gcc hello.c -o hello,运行这个命令,处理 hello.c 文件,并生成一个名为“hello”的二进制文件

Clang和GCC比较

Clang编译速度更快,编译产出更小、出错提示更友好。
clang采用的是BSD协议,这是苹果资助LLVM、FreeBSD淘汰GCC换用Clang的重要原因。
Clang是LLVM的一个编译器前端。
由于优秀的设计,使得Clang非常适合用于开发源代码级别的分析工具。
Clang对源程序进行语法分析和语义分析,并将分析结果转换为Abstract Syntax Tree(抽象语法树),最后使用LLVM作为后端代码的生成器。
Clang的开发目标是提供一个可以替代GCC的前端编译器。
由于GNU编译器套装(GCC)系统庞大,而且Apple大量使用的OC在GCC中优先级较低,同时GCC作为一个纯粹的编译系统,与IDE配合并不优秀。