Linux中无C语言“类库”概念,函数封装为静态库(.a)或动态库(.so),本质是将多个.o文件打包成可复用二进制模块,对外仅暴露头文件接口、隐藏实现细节。

在 Linux 中,函数封装成“类库文件”其实并不像 C++ 那样直接生成面向对象的 class 库——Linux 原生 C 生态中没有“类库”概念,而是通过静态库(.a)或动态库(.so)把多个函数打包成可复用的二进制模块。所谓“写成类库”,本质是把一组功能相关的函数(比如加减乘除、文件操作、线程管理等)统一实现、声明、编译并归档,对外只暴露头文件接口,内部实现细节隐藏。下面分步骤讲清楚怎么做。
准备函数源码与头文件
这是封装的基础。你需要:
- 一个或多个 .c 文件,实现所有待封装函数(如
add.c、sub.c、log_init.c); - 一个统一的 .h 头文件(如
math_utils.h),只包含函数声明、宏定义、结构体声明,不放实现; - 头文件中务必使用
#ifndef / #define / #endif防止重复包含; - 函数命名建议带前缀(如
mu_add()、mu_sub()),避免与其他库符号冲突。
编译目标文件(.o)
每个 .c 文件先单独编译为目标文件,不链接:
gcc -c add.c -o add.ogcc -c sub.c -o sub.o- 若要制作动态库,必须加
-fPIC:gcc -fPIC -c add.c -o add.o
这一步生成的是位置无关的目标代码,是后续打包成库的原材料。
打包成静态库(.a)或动态库(.so)
根据使用场景选择一种方式:
-
静态库(推荐初学/嵌入式/独立部署):
ar rcs libmathutils.a add.o sub.o
生成libmathutils.a,命名必须以lib开头、.a结尾。 -
动态库(推荐服务端/频繁更新/节省内存):
gcc -shared -fPIC -o libmathutils.so add.o sub.o
生成libmathutils.so,同样需遵守libxxx.so命名规范。
在其他程序中调用该库
交付时,需同时提供:头文件(.h) + 库文件(.a 或 .so)。
- 编译时指定头文件路径:
gcc main.c -I./include - 链接静态库:
gcc main.c -L. -lmathutils -o app(-lmathutils自动找libmathutils.a) - 链接动态库:
gcc main.c -L. -lmathutils -o app,运行前确保系统能找到 so:
– 临时设置:export LD_LIBRARY_PATH=.
– 或复制到/usr/lib并执行ldconfig - 验证是否链接成功:
ldd app查看依赖列表。


















