前言
在 C 语言开发中,将通用功能封装为独立库是提升代码复用性、项目可维护性的核心手段。本文以自定义简易 math 库为例,手把手教你实现直接编译、静态库(.a)、动态库(.so) 三种编译调用方式!
一、基础文件准备(核心代码)
我们先创建 3 个核心文件,实现add(加法)、sub(减法)两个基础数学函数,结构清晰、可直接复用。
- math.h(头文件:函数声明):头文件用于声明函数接口,添加头文件保护宏防止重复包含,这是 C 语言开发的标准规范。
1 2 3 4 5 6 7 |
|
- math.c(源文件:函数实现):实现头文件中声明的函数逻辑,是库文件的核心代码。
1 2 3 4 5 6 7 8 9 10 11 |
|
- main.c(主程序:调用库函数):主程序文件,引入自定义头文件,调用 math 库中的函数完成测试。
1 2 3 4 5 6 7 8 9 10 |
|
二、方式 1:直接编译(简易版,无独立库)
适合小型项目 / 临时测试,不生成独立库文件,直接将所有源文件编译为可执行程序,简单快捷。
- 编译:将main.c和math.c一起编译,生成可执行文件main
1 |
|
- 运行程序
1 |
|
运行结果
三、方式 2:编译为静态库(.a)【推荐分发使用】
静态库是编译时嵌入可执行文件的库文件(后缀.a),运行时无外部依赖,适合独立分发工具。
完整步骤
- 编译生成目标文件(.o):仅编译不链接,生成中间目标文件
1 |
|
参数说明:-c 表示只执行编译操作,不进行链接。
- 打包生成静态库(libmath.a):使用ar命令将目标文件打包为静态库,Linux 库文件必须以lib开头。
1 |
|
参数说明:
r:替换 / 插入文件到库中;
c:创建新库;
s:生成库索引,提升链接速度。
- 编译主程序,链接静态库
1 |
|
参数说明:
-L.:指定库文件搜索路径为当前目录;
-lmath:链接名为libmath.a的静态库(自动补全lib前缀和.a后缀)。
- 运行程序
四、方式 3:编译为动态库(.so)【大型项目首选】
动态库(共享库,后缀.so)是运行时加载的库,多个程序可共享使用,节省内存,适合大型项目、系统级开发。
- 编译生成动态库(libmath.so)
1 |
|
参数说明:
-shared:指定生成动态共享库;
-fPIC:生成位置无关代码(动态库必备参数)。
- 编译主程序,链接动态库:命令与静态库完全一致,编译器会优先匹配.so动态库:
1 |
|
- 关键:解决动态库运行依赖——直接运行./main会报错:error while loading shared libraries: libmath.so
原因:系统默认仅搜索/lib//usr/lib等系统目录,不会查找当前目录。
解决方案:将当前路径加入库文件路径中。
1 |
|
- 运行
1 |
|
以上就是C语言中三种库的编译和使用方法的详细内容