news 2026/8/18 10:43:14

C语言中三种库的编译和使用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言中三种库的编译和使用方法

前言

在 C 语言开发中,将通用功能封装为独立库是提升代码复用性、项目可维护性的核心手段。本文以自定义简易 math 库为例,手把手教你实现直接编译、静态库(.a)、动态库(.so) 三种编译调用方式

一、基础文件准备(核心代码)

我们先创建 3 个核心文件,实现add(加法)、sub(减法)两个基础数学函数,结构清晰、可直接复用。

  1. math.h(头文件:函数声明):头文件用于声明函数接口,添加头文件保护宏防止重复包含,这是 C 语言开发的标准规范。

1

2

3

4

5

6

7

#ifndef MATH_H

#define MATH_H

// 加法函数声明

intadd(inta,intb);

// 减法函数声明

intsub(inta,intb);

#endif

  1. math.c(源文件:函数实现):实现头文件中声明的函数逻辑,是库文件的核心代码。

1

2

3

4

5

6

7

8

9

10

11

#include "math.h"

// 加法实现

intadd(inta,intb) {

returna + b;

}

// 减法实现

intsub(inta,intb) {

returna - b;

}

  1. main.c(主程序:调用库函数):主程序文件,引入自定义头文件,调用 math 库中的函数完成测试。

1

2

3

4

5

6

7

8

9

10

#include <stdio.h>

#include "math.h" // 引入自定义math库头文件

intmain() {

inta = 10, b = 5;

// 调用库函数

printf("%d + %d = %d\n", a, b, add(a, b));

printf("%d - %d = %d\n", a, b, sub(a, b));

return0;

}

二、方式 1:直接编译(简易版,无独立库)

适合小型项目 / 临时测试,不生成独立库文件,直接将所有源文件编译为可执行程序,简单快捷。

  1. 编译:将main.c和math.c一起编译,生成可执行文件main

1

gcc main.c math.c -o main

  1. 运行程序

1

./main

运行结果

三、方式 2:编译为静态库(.a)【推荐分发使用】

静态库是编译时嵌入可执行文件的库文件(后缀.a),运行时无外部依赖,适合独立分发工具。
完整步骤

  1. 编译生成目标文件(.o):仅编译不链接,生成中间目标文件

1

gcc -c math.c -o math.o

参数说明:-c 表示只执行编译操作,不进行链接。

  1. 打包生成静态库(libmath.a):使用ar命令将目标文件打包为静态库,Linux 库文件必须以lib开头。

1

ar rcs libmath.a math.o

参数说明:
r:替换 / 插入文件到库中;
c:创建新库;
s:生成库索引,提升链接速度。

  1. 编译主程序,链接静态库

1

gcc main.c -L. -lmath -o main

参数说明:
-L.:指定库文件搜索路径为当前目录;
-lmath:链接名为libmath.a的静态库(自动补全lib前缀和.a后缀)。

  1. 运行程序

四、方式 3:编译为动态库(.so)【大型项目首选】

动态库(共享库,后缀.so)是运行时加载的库,多个程序可共享使用,节省内存,适合大型项目、系统级开发。

  1. 编译生成动态库(libmath.so)

1

gcc -shared -fPIC math.c -o libmath.so

参数说明:
-shared:指定生成动态共享库;
-fPIC:生成位置无关代码(动态库必备参数)。

  1. 编译主程序,链接动态库:命令与静态库完全一致,编译器会优先匹配.so动态库:

1

gcc main.c -L. -lmath -o main

  1. 关键:解决动态库运行依赖——直接运行./main会报错:error while loading shared libraries: libmath.so

原因:系统默认仅搜索/lib//usr/lib等系统目录,不会查找当前目录。
解决方案:将当前路径加入库文件路径中。

1

exportLD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

  1. 运行

1

./main

以上就是C语言中三种库的编译和使用方法的详细内容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 10:41:40

STM32入门教程·专栏结语:从“点灯大师“到“真懂“的这段路

前言 如果你是从这个专栏第一篇文章一路看过来的&#xff0c;那恭喜你&#xff0c;咱们终于走到"结业"这一步了。 说实话&#xff0c;当我写完专栏里最后一篇笔记时&#xff0c;我坐在电脑前愣了一会儿——原来江科大那个几十小时的入门教程&#xff0c;我真的一点…

作者头像 李华
网站建设 2026/8/18 10:40:13

迈锐宝XL中高配选购指南:从核心配置到场景化决策全解析

1. 从“够用”到“好用”&#xff1a;迈锐宝XL的配置抉择困局 每次看到“买中配还是买高配”这个问题&#xff0c;我都能想起自己当初选车时&#xff0c;在4S店里对着配置单反复纠结的那个下午。对于雪佛兰迈锐宝XL这款车来说&#xff0c;这个选择题尤其典型。它不像一些豪华品…

作者头像 李华
网站建设 2026/8/18 10:36:41

硬派越野车市场分析:帕杰罗为何在电气化时代依然坚挺?

1. 从一则声明看硬派越野市场的“变”与“不变”最近&#xff0c;一则来自三菱汽车的官方声明&#xff0c;在车圈里激起了不小的涟漪。声明内容很明确&#xff1a;帕杰罗&#xff08;Pajero&#xff09;这款经典的硬派越野车&#xff0c;将继续在中国市场销售。对于很多越野老炮…

作者头像 李华
网站建设 2026/8/18 10:36:30

AI视频生成实战:从零构建短剧的完整工作流与避坑指南

你有没有想过&#xff0c;为什么现在打开短视频平台&#xff0c;那些制作精良、剧情紧凑的短剧越来越多了&#xff1f;它们看起来像是有专业团队在背后运作&#xff0c;但你可能不知道&#xff0c;其中一部分的诞生&#xff0c;已经不再需要庞大的剧组、昂贵的设备和漫长的后期…

作者头像 李华
网站建设 2026/8/18 10:35:01

PCB打样数量决策完整清单从打样到试产避坑指南

很多硬件工程师做项目&#xff0c;每一次投板都纠结到底做多少块 PCB。1 片、3 片、5 片、10 片如何选择&#xff1f;不同项目阶段&#xff0c;样板数量的决策&#xff0c;直接关系研发成本、项目进度、风险控制。本篇提供一套完整可复用决策清单&#xff0c;同时讲解打样数量与…

作者头像 李华
网站建设 2026/8/18 10:34:51

Python自动化CAD处理指南:用ezdxf轻松读写DXF文件

Python自动化CAD处理指南&#xff1a;用ezdxf轻松读写DXF文件 【免费下载链接】ezdxf Python interface to DXF 项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf 深夜十一点&#xff0c;工程师小张还在加班。他面前是三百多张DXF图纸——每一张都要手动修改图层名、…

作者头像 李华