前言
遇到需要安装tfserving安装模块时,需要通过bazel去编译,所以就去了解这些编译工具,并做相关记录。
编译的作用
对于我们用C, C++, java,go等语言编写的代码,电脑是不能直接阅读理解的(chatGPT 可能理解,但我们说的是机器本身);所以我们需要将这些代码翻译给机器,让机器明白我们写的代码。这样一个过程就叫做编译。
GCC
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。
如图所示,c文件使用gcc 通过 预处理,编译 汇编,链接等操作,然后成为可执行文件,这就完成这个编译过程。
make
make是一个命令工具,通过makefile文件完成一系列文件的编译。一般单个文件用gcc编译没什么问题,但是对于工程来说,有很多的文件不可能逐个使用gcc去编译,因此用make就更省时省力。makefile文件就是告诉make 有条理的去完成编译工作。详细make教程参考:Make 命令教程 - 阮一峰的网络日志
cmake
CMake(cross platform make)是一个跨平台的安装(编译)工具。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(构建文件)(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
CMakeLists.txt 规定了整个编译的流程,我们学习的CMake 也就是要学习CMakeLists.txt的编写规则 可参考文章CMake应用:CMakeLists.txt完全指南 - 知乎
Bazel
Bazel:Build and test software of any size, quickly and reliably任意大小、快速、可靠的测试软件。Bazel是google推出的一款工程编译工具,并且已经将其开源。
bazel的优势:加快构建和测试速度,一种工具,多种语言,可缩放.
- Workspace :通常你可以理解为一个工程,对应一个repo,一个项目有自己唯一名字(Bazel鼓励它是全网唯一的);一个Workspace的顶层目录下应该有一个
WORKSPACE
文件; - Packages :一个包含
BUILD
文件的目录和其目录下的其他所有文件和子文件夹(包含BUILD
文件的子文件夹除外); - Targets :一个构建目标;由一个规则(
rule
)给出,必须有一个名字;
bazel 命令相关文档 命令和选项 | Bazel