资讯动态

Linux 学习笔记(二十四):动手制作静态库与动态库

发布时间:2026/10/26 10:18:54 来源:尧图企业网站定制
一、 库的概念库Library是写好的、可复用的二进制代码。Linux 下分为静态库.a编译时直接拷贝进可执行文件。体积大但无外部依赖。动态库.so运行时才被加载。多个进程共享一份节省资源但存在依赖问题。二、 制作静态库# 1. 生成目标文件 gcc -c mymath.c -o mymath.o # 2. 使用 ar 归档打包rc: 替换并创建 ar -rc libmymath.a mymath.o使用gcc main.c -I. -L. -lmymath -o main-I头文件路径-L库路径-l库名。三、 制作动态库# 1. 生成位置无关的目标文件-fPIC 非常重要 gcc -fPIC -c mymath.c -o mymath.o # 2. 生成共享库-shared gcc -shared -o libmymath.so mymath.o使用gcc main.c -I. -L. -lmymath -o main。四、 踩坑记录动态库找不到报错现象编译成功但运行./main时提示error while loading shared libraries: libmymath.so: cannot open shared object file。原因程序运行时OS 并不知道你当前目录下有一个动态库。解决临时解决将当前目录加入环境变量export LD_LIBRARY_PATH.:$LD_LIBRARY_PATH。根本解决将.so拷到系统的/usr/lib目录或者配置/etc/ld.so.conf.d/。五、 静态库与动态库的区别静态库被删除后可执行程序依然可以运行代码已嵌入。动态库被删除后可执行程序立刻报错罢工。相同源码下静态链接生成的可执行文件比动态链接的大得多。自我实战操作我们需要自己造一个库来用。为了不搞乱之前的代码我们新建一个目录。cd ~/linux_study mkdir lib_test cd lib_test实战 1准备库的源码我们需要两个文件一个头文件对外声明一个源文件具体实现。# 1. 写头文件 vim mymath.h#pragma once int my_add(int a, int b);# 2. 写源文件 vim mymath.c#include mymath.h int my_add(int a, int b) { return a b; }实战 2制作静态库# 1. 先把源文件编译成目标文件 .o gcc -c mymath.c -o mymath.o # 2. 用 ar 工具打包成静态库rc 代表 replace and create ar -rc libmymath.a mymath.o # 3. 看看生成的文件 ls -l # 会看到一个叫 libmymath.a 的文件实战 3使用静态库新建一个主程序vim main.c#include stdio.h #include mymath.h int main() { printf(10 20 %d\n, my_add(10, 20)); return 0; }编译运行# 编译-I 指定头文件路径当前目录 .-L 指定库路径-l 指定库名 gcc main.c -I. -L. -lmymath -o main_static # 运行 ./main_static考验时刻现在你把这个libmymath.a删掉再运行./main_static你会发现它依然能跑因为库的代码已经“塞进”程序里了。实战 4制作并使用动态库# 1. 制作动态库需要加 -fPIC生成位置无关码和 -shared生成共享库 gcc -fPIC -c mymath.c -o mymath.o gcc -shared -o libmymath.so mymath.o # 2. 编译主程序 gcc main.c -I. -L. -lmymath -o main_dynamic # 3. 运行试试 ./main_dynamic报错预警你大概率会看到error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory。原因程序运行时系统默认只会去/lib、/usr/lib等系统目录找库找不到你当前目录下的库。实战 5解决动态库找不到的问题三种方法我们选最简单的一种临时改变环境变量# 指定系统去找动态库的路径包含当前目录 . export LD_LIBRARY_PATH.:$LD_LIBRARY_PATH # 再次运行 ./main_dynamic 成功运行

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑