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

 更新时间:2026年04月13日 08:37:51   作者:Hello小赵  
本文介绍了C语言自定义简易math库的三种编译方式:直接编译、静态库(.a)和动态库(.so),每种方式都有详细步骤和代码示例,适合不同场景下的项目需求,需要的朋友可以参考下

前言

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

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

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

  1. math.h(头文件:函数声明):头文件用于声明函数接口,添加头文件保护宏防止重复包含,这是 C 语言开发的标准规范。
#ifndef MATH_H
#define MATH_H
// 加法函数声明
int add(int a, int b);
// 减法函数声明
int sub(int a, int b);
#endif
  1. math.c(源文件:函数实现):实现头文件中声明的函数逻辑,是库文件的核心代码。
#include "math.h"

// 加法实现
int add(int a, int b) {
    return a + b;
}

// 减法实现
int sub(int a, int b) {
    return a - b;
}
  1. main.c(主程序:调用库函数):主程序文件,引入自定义头文件,调用 math 库中的函数完成测试。
#include <stdio.h>
#include "math.h"  // 引入自定义math库头文件

int main() {
    int a = 10, b = 5;
    // 调用库函数
    printf("%d + %d = %d\n", a, b, add(a, b));
    printf("%d - %d = %d\n", a, b, sub(a, b));
    return 0;
}

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

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

  1. 编译:将main.c和math.c一起编译,生成可执行文件main
gcc main.c math.c -o main
  1. 运行程序
./main

运行结果

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

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

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

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

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

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

  1. 编译主程序,链接静态库
gcc main.c -L. -lmath -o main

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

  1. 运行程序

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

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

  1. 编译生成动态库(libmath.so)
gcc -shared -fPIC math.c -o libmath.so

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

  1. 编译主程序,链接动态库:命令与静态库完全一致,编译器会优先匹配.so动态库:
gcc main.c -L. -lmath -o main
  1. 关键:解决动态库运行依赖——直接运行./main会报错:error while loading shared libraries: libmath.so

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

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
  1. 运行
./main

以上就是C语言中三种库的编译和使用方法的详细内容,更多关于C语言库的编译和使用的资料请关注脚本之家其它相关文章!

相关文章

  • C语言三个函数的模拟实现详解

    C语言三个函数的模拟实现详解

    这篇文章主要为大家详细介绍了C语言三个函数的模拟实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++IO流之fstream, stringstream使用小结

    C++IO流之fstream, stringstream使用小结

    C语言中常用的输入输出函数有如下几种:前者是格式化标准输入输出,后者是格式化文件输入输出,最后是格式化字符串输入输出,这篇文章主要介绍了C++IO流:fstream, stringstream总结,需要的朋友可以参考下
    2022-04-04
  • C语言数据结构之算法的时间复杂度

    C语言数据结构之算法的时间复杂度

    这篇文章主要介绍了C语言数据结构之算法的时间复杂度,文章基于c语言的相关资料展开详细介绍,具有一定的参价值,需要的小伙伴可以参考一下
    2022-05-05
  • C语言线程池的常见实现方式详解

    C语言线程池的常见实现方式详解

    本文介绍了如何使用 C 语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • C++ 多态性虚函数和动态绑定学习笔记

    C++ 多态性虚函数和动态绑定学习笔记

    这篇文章主要为大家介绍了C++ 多态性虚函数和动态绑定学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C语言中枚举与联合体的使用方法(enum union)

    C语言中枚举与联合体的使用方法(enum union)

    枚举的意思就是列举,将每一个可能的取值都进行一一列举,下面这篇文章主要给大家介绍了关于C语言中枚举与联合体的使用方法,需要的朋友可以参考下
    2021-09-09
  • C++中的list与forward_list介绍与使用

    C++中的list与forward_list介绍与使用

    本文大家介绍C++中list和forward_list的底层结构(双向/单向链表)、迭代器失效机制及与vector的对比,重点分析其插入删除效率、空间利用率和适用场景,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • C语言创建链表错误之通过指针参数申请动态内存实例分析

    C语言创建链表错误之通过指针参数申请动态内存实例分析

    这篇文章主要介绍了C语言创建链表错误之通过指针参数申请动态内存,是链表创建过程中非常常见的经典错误。实例中做了较为详尽的分析,需要的朋友可以参考下
    2014-09-09
  • 使用C语言编写钢琴小程序

    使用C语言编写钢琴小程序

    这篇文章主要为大家详细介绍了使用C语言编写钢琴小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Opencv实现联合双边滤波

    Opencv实现联合双边滤波

    这篇文章主要为大家详细介绍了Opencv实现联合双边滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论