静态库和动态库

静态库

Linux中静态库以lib作为前缀,.a作为后缀,中间是库的名字。即libxxx.a
Windows中静态库以lib作为前缀,.lib作为后缀,中间是库的名字。即libxxx.lib

生态静态链接库(ar)

  • c:创建一个库
  • s:创建归档索引
  • r:醍醐寺内归档文件中已有的文件或加入新文件

.
├── include
│   └── head.h
└── src
├── add.c
├── div.c
├── mult.c
└── sub.c

1
2
3
4
5
# 1.对源文件进行汇编操作
$ gcc src/*.c -c -Iinclude

# 2.打包.o文件生成静态库
$ ar rcs libxxx.a *.o

静态库的使用

.
├── include
│   └── head.h
├── lib
│   └── libcalc.a
└── main.c

  • -I:指定include包含的头文件路径
  • -L:指定静态库/动态库路径
  • -l:指定静态库/动态库名字(掐头去尾)
1
2
3
4
# 1.拿到发布的静态库和头文件
# 2.编写测试程序main.c
# 3.编译测试文件
$ gcc main.c -o main -Iinclude -Llib -lxxx

动态库

Linux中动态库以lib作为前缀,.so作为后缀,中间是库的名字。即libxxx.so
Windows中动态库以lib作为前缀,.dll作为后缀,中间是库的名字。即libxxx.dll

生成动态链接库(-fpic, -shared)

  • -fpic:生成与位置无关的代码
  • -shared:生成一个动态链接库

.
├── include
│   └── head.h
└── src
├── add.c
├── div.c
├── mult.c
└── sub.c

1
2
3
4
5
# 1.将源文件进行汇编操作(-c, -fpic)
$ gcc src/*.c -o -fpic -Iinclude

# 2.将.o文件打包成动态库(-shared)
$ gcc -shared *.o -o libxxx.so

动态库的使用

.
├── include
│   └── head.h
├── lib
│   └── libcalc.so
└── main.c

1
2
3
4
5
6
# 1.拿到发布的动态库和头文件
# 2.编写测试程序
# 3.编译测试程序
$ gcc main.c -o main -Iinclude -Llib -lxxx

# 4.添加动态库加载目录

添加动态库加载目录

方法1:修改LD_LIBRARY_PATH

1.找到相关的配置文件

  • 用户级别:~/.bashrc
  • 系统级别:/etc/profile

2.使用vim打开配置文件,并添加动态库绝对路径(pwd查看)

1
2
# 在最后一行添加以下内容
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库路径

3.让配置文件生效

1
2
$ source ~/.bashrc
$ source /etc/profile

方法2:更新/etc/ld.so.conf文件

1.将动态库的绝对路径添加到文件的末尾

1
$ sudo vim /etc/ls.so.conf

2.更新/etc/ld.so.conf文件

1
$ source ldconfig

方法3:拷贝动态库到/lib//usr/lib文件中

1
$ sudo cp libxxx.so /usr/lib

方法4:将库的软链接放到/lib//usr/lib文件中

1
$ sudo ln libxxx.so /usr/lib/libxxx.so

Reference

Linux静态库与动态库整理


静态库和动态库
http://example.com/2025/02/22/Cpp/静态库和动态库/
作者
ZhangHangming
发布于
2025年2月22日
许可协议