Linux 动静态库原理及编译链接实战
什么是库
库是写好的、成熟的、可复用的代码集合。现实中的程序依赖大量底层基础库,不可能从零开始编写所有功能。在 Linux 下,动静态库本质上是指定目录下的普通文件,可以被操作系统载入内存执行。
- 静态库:扩展名为
.a(Linux) 或.lib(Windows) - 动态库:扩展名为
.so(Linux) 或.dll(Windows)
我们将 .o 文件称为可重定位目标文件(Relocatable Object File),它是编译后的中间产物,尚未完成最终链接。

制作库的演进过程
理解库的制作,可以从一个实际场景切入:开发者如何安全地复用代码?
假设张三写好了 C 语言代码,李四需要调用这些功能。张三有三种交付方式:
1. 交付源代码
直接拷贝 .c 和 .h 文件。李四可以修改变量名后编译。
gcc -o myexe *.c
这种方式最灵活,但无法保护源码逻辑,且每次都要重新编译。
2. 交付目标文件 (.o)
如果老师要求检查实现逻辑,张三只给 .o 和 .h 文件。
gcc -o myexe *.o
这隐藏了源码,但多个 .o 文件管理起来很麻烦,且容易冲突。
3. 交付静态库 (.a)
将多个 .o 文件打包成一个归档文件。这是静态库的本质:将编译后的对象文件打包。
使用 ar 命令(GNU 归档工具):
ar rc libmyc.a *.o
# r: replace/create, c: create archive, v: verbose
这样李四只需引用头文件和库文件即可,无需关心内部实现细节。
链接时的关键参数
当李四尝试链接时,可能会遇到找不到函数的错误。这时需要告诉编译器库的位置和名称。
-
-l 库名称:指定要链接的库。注意去掉前缀
lib和后缀.a。例如-lmyc。gcc -o myexe main.c -L./lib -lmycGCC 默认认识标准 C 库,所以通常不需要显式加
-lc。 -
-L 库文件路径:指定库文件所在的目录。如果库不在系统默认路径下,必须指定。
gcc -o myexe main.c -L./lib -lmyc最佳实践是将库安装到系统默认路径(如
/lib64),这样就不需要-L参数了。 -
-I 搜索头文件路径:指定头文件的查找路径。自定义头文件通常用双引号 引用,若要像系统库一样用尖括号 ,需配置 。


