一般来说,链接阶段的任务是将同一项目中每个源文件产生的目标文件和程序使用的库文件组合成一个可执行文件。
通过系统学习之前的gcc(g++)命令,我们学会了如何使用gcc -c命令从源文件生成相应的目标文件。那么什么是库文件呢?
所谓库文件对应的是一个压缩包文件,通常包含若干个目标文件(即二进制文件)。请注意,存储在库文件内每个目标文件中的代码是一个工作功能模块,而不是一个完整的程序。例如,C语言库文件提供了很多函数(scanf()、printf()、strlen()等),C++库文件提供了很多函数以及有用的函数。预先设计的类(例如字符串类型)。
生成库文件极大地提高了程序员的开发效率,无需从头开发许多功能,并且可以直接调用包含函数的库文件。调用库文件的方法也很简单,以C语言printf()输出函数为例,程序只需导入<stdio.h>头文件,调用printf()函数即可。
有的读者可能会问为什么调用库文件会涉及到头文件呢?首先,头文件和库文件不是一回事,它们之间最大的区别是头文件只包含变量、函数或类等功能模块的声明部分,而库文件包含具体的实现信息。您有责任保存它。每个模块的部分。读者可以这样理解:每个库文件都提供了相应的头文件作为调用它的接口。这意味着库文件不能直接使用,只能通过头文件间接调用。
头文件和库文件组合访问机制的最大优点是,如果您希望其他人能够使用您实现的函数,或者如果您不想公开函数的源代码,则可以将您的函数转换为库。你能做什么。最重要的是二进制文件,而头文件只包含声明部分,这样就达到了“隐藏源代码”的目的,同时又不影响用户的使用。我们将在后面的章节中详细介绍如何创建库文件。
事实上,库文件只是一类压缩包的总称,所有压缩包都包含有功能且有用的目标文件。请注意,虽然在程序的链接阶段使用了库文件,但编译器提供了两种实现链接的方式:静态链接和动态链接。采用静态链接方式实现链接操作的称为静态链接库,采用动态链接方式实现链接操作的库文件称为动态链接库。
那么静态链接库和动态链接库有什么区别呢?
静态链接库
静态链接 实现库链接操作的方式非常简单。这意味着当程序文件中使用库文件中的功能模块时,GCC编译器将模板代码直接复制到程序中的适当位置。创建文件并最终生成可执行文件。
使用静态库文件来完成程序链接操作有以下优点和缺点:
- 优点是生成的可执行文件可以独立运行,不需要静态库文件的支持(可移植性强)。
- 缺点是,如果在一个程序文件中多次调用库中的相同功能模块,则模块代码不可避免地会被复制多次,生成的可执行文件将包含多段相同的代码,而这些代码就会产生冗余。
与使用动态链接库生成的可执行文件相比,使用静态链接库生成的可执行文件更大。
另请注意,在 Linux 发行版系统上,静态链接库文件通常具有后缀 .a,而在 Windows 系统上,静态链接库文件的后缀为 .lib。
动态链接库
动态链接库,也称为共享链接库。与静态链接库不同,当使用动态链接库完成链接操作时,当程序文件需要库文件中的功能模块时,GCC编译器不会直接复制功能模块中的代码。而是将功能模块的位置信息记录在文件中,直接生成可执行文件。
显然,以这种方式生成的可执行文件无法自行运行。当执行动态链接库产生的可执行文件时,GCC编译器将相应的动态链接库一起加载到内存中,该可执行文件中预先记录了所需功能模块的位置信息,因此它也可以成功运行。具有现有的动态链接和库支持。
使用动态链接库来完成程序连接操作的优点和缺点与静态链接库正好相反。
- 优点是功能模块的地址记录在可执行文件中,因此程序运行时实际的实现代码会被加载到内存中。这意味着如果一个功能模块被多次调用,它将具有相同的实现。代码(这也是动态链接库被称为共享链接库的原因)。
- 缺点是这样生成的可执行文件不能独立运行,必须依赖相应的库文件(可移植性较差)。
与使用静态链接库生成的可执行文件相比,动态链接库生成的可执行文件的大小更小,因为不会在内部复制一堆冗余代码。
在Linux发行版系统上,动态链接库的后缀通常为.so,在Windows系统上,动态链接库的后缀为.dll。

注意,GCC编译器生成可执行文件时,默认情况下优先使用动态链接库来完成链接操作,但如果当前系统环境没有程序文件所需的动态链接库则GCC编译器选择除外。相应的静态链接库。如果两者都不存在(或被 GCC 编译器检测到),链接将会失败。
在 Linux 发行版上,静态和动态链接库通常存储在 /usr/bin 或 /bin 目录中。图1展示了CentOS系统的/usr/bin目录中系统库文件的存储方式。
除了使用链接库文件之外,您还可以自定义静态或动态链接库以用于实际开发。链接库文件的具体创建和使用将在后续章节详细讨论。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

