一、开放源码(Open Source Code)
开放源码指的是软件的源代码对公众开放,允许任何人查看、修改和分发。在Linux生态系统中,开放源码是其核心哲学之一。Linux内核本身以及大多数在其上运行的应用程序都是开放源码的。这意味着开发者可以自由地学习现有代码、贡献代码改进、定制软件以满足特定需求,或者创建全新的应用程序。开放源码鼓励技术共享、协作创新,并促进软件质量的提升,因为代码的透明性允许全球的开发者共同审查和优化。
二、编译器(Compiler)
编译器是一种特殊的程序,它的作用是将程序员编写的高级语言代码(如C、C++、Java等)转换为计算机硬件可以直接执行的低级机器语言代码或汇编语言代码。在Linux系统中,常见的编译器有GCC(GNU Compiler Collection)、Clang/LLVM等。编译过程大致分为预处理、编译、汇编和链接几个阶段。编译器通过词法分析、语法分析、语义分析等步骤,将高级语言的抽象概念转换为具体的指令序列,最终生成可执行文件或库文件。
三、可执行文件(Executable File)- 二进制文件
可执行文件是包含机器语言指令的文件,可以直接由计算机的CPU执行。在Linux系统中,常见的可执行文件格式是ELF(Executable and Linkable Format)。当一个程序被编译并链接完成之后,就会生成一个可执行文件,通常具有执行权限。用户通过在终端输入文件名并加上执行权限(如./my_program
)来运行这个程序。可执行文件可以是独立的程序,也可以是与其他库动态或静态链接的结果,具体取决于编译时的配置。
四、函数库
4.1 介绍
在计算机科学中,函数库是一组可重用的函数集合。这些函数可以被多个程序调用和使用,从而简化了开发过程并提高了代码的复用性。
在Linux系统中,函数库通常以共享库(shared library)的形式存在。共享库是一种特殊的文件类型,它包含了一组相关的函数实现。当一个程序链接到某个共享库时,该程序就可以访问库中的所有函数。这样做的好处是可以减少内存占用和磁盘空间,因为多个程序可以共享同一份库文件。
常见的Linux函数库包括标准C库(glibc)、数学库(libm)、图形界面库(GTK+、Qt)等等。这些库提供了许多基本的功能,例如字符串处理、文件操作、网络通信等等。
此外,在Linux系统中还有静态库(static library)的概念。静态库是一个包含已编译好的目标代码的文件,当一个程序链接到静态库时,库中的代码会被直接复制到最终生成的可执行文件中。与共享库相比,静态库的优点是不需要依赖外部库文件即可运行,但缺点是会增加可执行文件的大小。
4.2 静态函数库
- 命名:静态函数库通常以
.a
作为文件扩展名。 - 链接时间:静态函数库在程序编译期间(链接阶段)被直接整合到目标程序中。这意味着程序所需的函数代码会被完整地复制到最终的可执行文件里。
- 程序运行:由于所需的所有代码都已经包含在可执行文件内部,因此运行时不需要再依赖外部的库文件。
- 优缺点:
- 优点:程序独立性强,不需要考虑库文件的存在与否,便于分发和移植。
- 缺点:生成的可执行文件体积较大,因为包含了库的所有代码,即使某些部分并未使用。同时,如果静态库更新,程序也需要重新编译才能获取新功能或修复。
4.3 动态函数库(共享函数库)
- 命名:动态函数库通常以
.so
(shared object)作为文件扩展名。 - 链接时间:动态函数库在程序编译时不会被直接整合进可执行文件,而是仅仅保留对库中函数的引用。
- 程序运行:程序运行时,操作系统负责加载动态库到内存中,并解析程序对库函数的调用。这意味着程序执行时必须能够找到相应的动态库文件。
- 优缺点:
- 优点:减小了可执行文件的大小,节省了内存和磁盘空间,因为多个程序可以共享同一个动态库的副本。此外,更新库文件后,无需重新编译依赖它的程序,只需替换库文件即可。
- 缺点:程序运行依赖于外部库文件的存在,若库文件缺失或版本不兼容,可能导致程序无法运行。
4.4 静态与动态函数库相同点
- 构建方式:无论是静态库还是动态库,它们都是由目标文件(
.o
文件)经过特定工具(如ar
用于静态库,gcc
/ld
的特定选项用于动态库)打包而成。 - 目的:两者都是为了提供一组可重用的函数或对象给其他程序使用,以提高代码的模块化和复用性。
4.5 静态与动态函数库不同之处
- 链接时机:静态库在编译时链接,动态库在运行时链接。
- 资源占用与更新:动态库减少了程序的大小并允许库独立更新,而静态库则使得每个程序都包含了完整的库代码,不便于库的维护和升级。
- 程序依赖:静态链接的程序是自包含的,而动态链接的程序需要运行环境提供相应的动态库