1、构建是什么?
构建指的是将源代码转换为可执行程序、库文件或者其他输出成果的过程。
其他输出成果:打包为安装包、自动生成API应用文档、便于在不同服务器上快速部署的Docker镜像等;
2、构建的核心过程
2.1、编译(Compilation)
将人类可读的源代码(如 C/C++、Python 等)翻译成计算机能识别的机器语言,生成目标文件如.o或.obj。
目标文件主要组成:
- 代码段(.text),编译后的机器指令;
- 数据段,.data已初始化数据,.bss未初始化数据;
- 符号表(.symtab),记录了目标文件中定义和引用的所有符号(如函数名、变量名等)信息,比如符号名称、符号类型、符号地址、符号作用域;
- 重定位信息(.rel.text、.rel.data 等),由于在编译过程中,编译器并不知道目标文件最终会被加载到内存的哪个地址,因此会将一些符号的地址暂时标记为相对地址。在链接过程中,链接器会根据这些重定位信息,将这些相对地址调整为实际的内存地址。
2.2、链接(Linking)
链接是什么?
链接是将多个目标文件和所需的库文件(如标准库、第三方依赖)组合成一个完整的可执行文件的过程。
为什么需要链接?
在编译过程中,每个源文件都会被独立编译成一个目标文件,这些目标文件可能会引用其他目标文件或库文件中的函数和变量,链接器的任务就是将这些引用解析并连接起来,生成一个可以在目标机器上运行的可执行文件。
可执行文件:可能是Windows环境的.exe文件,Linux环境的.out文件,嵌入式下的.bin文件或.hex文件等。
3、实际项目的构建形式
3.1、通用构建工具
CMake 是一个跨平台的构建工具,跨平台体现在可以根据同一个配置文件 CMakeLists.txt,来生成适应于不同平台的构建文件。
构建文件类型举例:
- Makefile,适用于Unix/Linux平台。
- Ninja,一个快速、轻量级的构建系统,支持并行构建,特别适用于大型项目和对构建速度要求较高的情况。
- Visual Studio项目文件,适用于 Windows 系统,可以直接在Microsoft Visual Studio中进行编译和调试。
- Xcode项目文件,适用于苹果的Xcode开发环境,用于构建和调试Mac和iOS应用程序。
也可以不使用CMake,比如一些简单的项目直接编写Makefile构建文件.
根据生成的(或编写的)构建文件类型,使用对应的构建工具执行编译。
比如,若生成的是Makefile,则运行make命令;若生成的是 Ninja 文件,则运行ninja命令。
3.2、集成开发环境(IDE)内置构建系统
有些集成开发环境(IDE)里会有内置的构建系统,提供了一键式的编译、链接和下载功能,简化了开发流程。
举例:
- Keil MDK
- IAR
- STM32CubeIDE