来自微信公众号:wu的学习笔记
01
前言
我们真的了解什么是构建工具吗?为什么需要构建工具?
02
Why构建工具?
当我们编写程序时,需要使用一种特定的编程语言来表达程序的逻辑。然而,计算机只能理解机器语言,因此需要将编程语言转换为机器语言,这个过程就是编译。编译器是一种程序,它将高级语言编写的源代码转换成目标机器上可执行的机器语言。
我们不用构建工具只使用编译工具也可以正常进行代码编译。如果一个工程有1000个文件,那么我们还需要用写1000个命令行编译文件吗?显然是不用的!
gcc Helloworld.c -o Helloworld
构建工具帮了我们大忙!!!编译器构建工具是用来构建编译器的工具,它们可以帮助编译器的开发者有效地对编译器进行管理。
常见的编译器构建工具包括自动构建工具CMake、Make、Ninja等。这些工具可以根据源代码和相应的Makefile或者ninja.build文件自动构建程序。构建工具可以帮助我们不用一行行的敲命令行进行编译,简化了我们的编译脚本的编写。
所以,构建工具就是帮助我们生成编译器编译代码的命令,并且调用编译器执行相关编译命令。
03
CMake工具
先破除两个认知误区:
-
CMake工具不直接调用编译器!!!!!
-
CMake不仅仅支持make构建工具也支持ninja构建工具!!!!!
回答第一个误区问题:CMake默认使用make工具调用编译器。
回答第二个误区问题:CMake可以使用-G参数指定其他构建工具,比如说ninja。
CMake仅仅是为了生成make或者ninja构建工具的对应的构建文件。
04
make工具
Make工具可以直接调用编译器,在编译过程中,会有相关信息打印出来。
make工具命令行参数的相关解释如下:
-
-b,-m参数可以忽略兼容性
-
-B参数无条件编译所有目标
-
-C参数=路径,特指进入到指定路径下进行编译
-
-d参数打印debug信息
-
--debug参数=标志,特指打印多个debugging信息
-
-e参数特指环境变量覆盖makefile文件中的变量
-
--eval=string参数特指参数解析成字符串并给到shell执行
-
-f参数指读取一个文件作为makefile文件
-
-i参数忽略错误
-
-I参数特指寻找包含的Makefile文件路径
-
-j参数指打开多少个线程进行编译
-
-k参数特指尽管有些目标无法被编译但是编译会继续进行
-
-l参数特指负载低于N之后开启多线程编译
-
-L参数特指使用mtime
-
-n参数特指输出打印所有执行命令,但是不执行
-
-o=某某文件,特指将某个文件认为是有变动的文件,方便重新编译
-
-O参数指定输出目录
-
-p:显示make的内部数据库。
-
-q:安静模式,不执行任何命令,只显示出来。
-
-r:禁用内置的隐含规则。
-
-R:禁用内置变量设置。
-
-s:不回显命令。
-
-S:显示当前目录。
-
-t:创建目标,而不是改造它们。
-
-v:显示详细信息。
-
-w:显示所有命令。
-
-W:在符号链接和目标之间使用最后的修改时间。
05
ninja工具
ninja工具的作用和make工具是类似的,也是用于调用编译器编译程序,一般来说,在汽车电子领域中,ninja大多用于编译C++,它可以加快C++的编译速度。
在Linux中,可以使用sudo apt-get install ninja-build安装ninja工具。
当我们使用cmake工具和ninja工具联合构建工程时,使用cmake命令行中尾加“-G Ninja”指令可以指定ninja为构建工具,而不是默认的make工具,cmake会生成ninja的构建脚本ninja.build相关文件,之后再调用ninja工具即可构建成功。
ninja工具命令行参数的相关解释如下:
-
--version参数:特指显示版本
-
-v参数:显示所有构建时的命令行参数
-
-C参数=路径,特指进入到指定路径下进行编译
-
-f参数指读取一个文件作为build.ninja文件
-
-j参数指打开多少个线程进行编译
-
-k参数特指尽管有些目标无法被编译但是编译会继续进行,直到第N个任务也失败
-
-l参数特指负载低于N之后开启多线程编译
-
-n参数特指输出打印所有执行命令,但是不执行
-
-d参数打印debug信息
-
-t参数用于执行特定的任务,通常是清理构建的输出
-
-w 参数在Ninja构建系统中用于指定警告的行为。它允许你控制Ninja在遇到警告时是否继续执行构建。
添加图片注释,不超过 140 字(可选)
END