C++中makefile的作用,lib库文件,编译链接的流程

Makefile 它用于指导 make 工具如何编译和链接程序。

NAME             = xxx
SRCS             = ...
LINKWITH         +=

NAME: 指定生成的目标文件(或库)的名称。SRCS: 列出了所有需要编译的源文件。这些文件将被编译成目标文件,并最终链接成目标程序或库。LINKWITH: 指定了其他需要链接的库文件或对象文件。在这个例子中,它为空,意味着没有额外的链接依赖。

Makefile 的强大之处在于它能够自动化编译过程,并且可以通过定义规则来处理复杂的依赖关系。当你在命令行中运行 make 命令时,make 工具会查找当前目录下的 Makefile 文件,并根据其中定义的规则来编译和链接程序。

在编程和软件开发中,库文件(Library file),通常简称为 lib,是一种包含预编译代码、函数、对象定义或资源的文件,它为程序提供了一种模块化的方法来组织和重用代码。库文件可以包含多种类型的代码,如函数、类、变量、常量等,它们可以被编译成不同的格式,以供不同的编程语言和平台使用。

编译(Compilation)
编译是将源代码(通常是指 `.c`、`.cpp` 等文件)转换成机器码的过程,生成目标代码,通常以对象文件的形式存在,对象文件的扩展名通常是 `.o` 或 `.obj`。

1. 预处理(Preprocessing)  处理源代码文件中的预处理指令,如宏定义的展开(`#define`)、条件编译(`#ifdef`、`#ifndef` 等)、包含头文件(`#include`)等。

2. 编译(Compilation proper) 将预处理后的源代码转换成汇编代码。这一步是由编译器完成的,例如 `gcc` 或 `clang`。

3. 汇编(Assembly) 将汇编代码转换成机器码。汇编器(assembler)将汇编指令转换成机器可以执行的二进制代码。

4. 链接前的优化(Optimization)  编译器可能会对生成的代码进行优化,以提高性能或减少生成的可执行文件的大小。

链接(Linking)
链接是将一个或多个对象文件与库文件结合起来,生成一个单一的可执行文件的过程。

1. 符号解析(Symbol Resolution)链接器解析对象文件和库文件中的符号(变量、函数等)引用,确保每个引用都能找到其定义。

2. 重定位(Relocation)链接器调整代码和数据的地址,因为不同的对象文件可能在编译时假设它们有不同的地址空间。

3. 合并代码和数据(Merging)链接器将所有对象文件和库文件中的代码和数据合并到一个单一的输出文件中。

4. 生成可执行文件(Executable Creation)最后,链接器生成最终的可执行文件,这个文件包含了运行程序所需的所有代码和数据。

5. 库链接(Library Linking)如果程序依赖于外部库,链接器会将这些库中的代码和数据链接到最终的可执行文件中。这可以是静态链接(在编译时链接库)或动态链接(在运行时加载库)。

在 Makefile 中,这些步骤通常是通过一系列的规则和命令来自动化的。例如,一个简单的编译命令可能看起来像这样:
g++ -c my_source.cpp -o my_source.o

这个命令使用 `g++` 编译器编译 `my_source.cpp` 文件,并生成一个名为 `my_source.o` 的对象文件。

一个简单的链接命令可能看起来像这样:
g++ my_source.o -o my_program

这个命令将 `my_source.o` 对象文件链接成最终的可执行文件 `my_program`。

在复杂的项目中,Makefile 会包含多个规则和依赖项,以确保正确的编译和链接顺序。运行 `make` 命令时,`make` 工具会根据 Makefile 中定义的规则来确定哪些文件需要重新编译或链接,并执行相应的命令。

参考:
https://blog.csdn.net/IT_Mitchell/article/details/83932742

  1. 源代码文件:这是开发者编写的初始代码,通常以 .c.cpp 等为扩展名。
  2. 预处理:这个阶段处理源代码中的预处理指令,如宏展开、文件包含、条件编译等。
  3. 编译:编译器将预处理后的源代码转换成汇编代码。
  4. 汇编:汇编器将汇编代码转换成机器码,生成对象文件。
  5. 链接前的优化:编译器可能会对生成的机器码进行优化,以提高程序的性能或减少大小。
  6. 对象文件:优化后的代码被保存为对象文件,通常以 .o 或 .obj 为扩展名。
  7. 链接:链接器将一个或多个对象文件与所需的库文件链接,生成最终的可执行文件。
  8. 可执行文件:这是最终的程序,可以被操作系统执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值