【Linux】静态库与动态库的制作

目录

1. 静态库的制作及使用步骤

1.1 生成与地址有关的 .o 文件

1.2 生成静态库

1.3 使用静态库

2. 动态库的制作及使用步骤

2.1 生成与地址无关的 .o 文件

2.2 生成动态库

2.3 使用动态库

2.3.1 临时解决方法,导入环境变量

2.3.2 将导入的环境变量写入 .bashrc 中,通过 . .bashrc 或者 source .bashrc 可立即生效

2.3.3 将动态库复制到 /lib 或者 /usr/lib 中,相当于使用标准库的路径,不推荐使用

2.3.4 通过修改配置文件 /etc/ld.so.conf.d/*.conf 

1. 静态库的制作及使用步骤

1.1 生成与地址有关的 .o 文件

# gcc -c *.c -o *.o
eg: gcc -c calc.c -o calc.o

1.2 生成静态库

# ar -cr lib库名.a  *.o
eg: ar -cr libcalc.a *.o

1.3 使用静态库

# gcc test.c -o test -L./lib -l库名     (ps: 库名通过 “掐头去尾留中央” 的方式获取)
eg: gcc test.c -o test -L./lib -lcalc

需要注意的是:通过静态库编译生成可执行文件后,即使删除了已经生成的静态库,也不会影响到可执行文件的运行。

  • 静态库的优点

加载库的速度快。

  • 静态库的缺点

1. 一旦库发生了改变,需要重新编译程序。

2. 静态库如果被打包到应用程序中,会导致库的体积变大,多次使用就会有多份静态库的复制。

综上,静态库适用于对空间要求较低,而对时间要求较高的程序中。

2. 动态库的制作及使用步骤

2.1 生成与地址无关的 .o 文件

# gcc -c *.c -fPIC -o *.o
eg: gcc -c calc.c -fPIC -o calc.o

2.2 生成动态库

# gcc -shared -o lib库名.so *.o
eg: gcc -shared -o libcalc.so calc.o

实际上,上述两个步骤可以合并为一个步骤,即:

# gcc *.c -fPIC -shared -o lib库名.so
eg: gcc calc.c -fPIC -shared -o libcalc.so

2.3 使用动态库

# gcc test.c -o test -L./lib -l库名     (ps: 库名通过 “掐头去尾留中央” 的方式获取)
eg: gcc test.c -o test -L./lib -lcalc

此时运行 ./test 报错:

./test: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

这是由于 动态链接器 找不到动态库 导致的,接下来给出四种方式解决该问题:

2.3.1 临时解决方法,导入环境变量

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
export LD_LIBRARY_PATH

该方法如果退出终端,则此环境变量不再生效。

2.3.2 将导入的环境变量写入 .bashrc 中,通过 . .bashrc 或者 source .bashrc 可立即生效

2.3.3 将动态库复制到 /lib 或者 /usr/lib 中,相当于使用标准库的路径,不推荐使用

2.3.4 通过修改配置文件 /etc/ld.so.conf.d/*.conf 

  • 首先通过 ldd ./test 查看 ./test 的动态库是否被装载
    • libcalc.so => not found
  • 如果是上述情况,则要手动添加动态库需要加载的路径
# echo `pwd` > /etc/ld.so.conf.d/*.conf
echo `pwd` > /etc/ld.so.conf.d/libcalc-x86_64.conf
  • 然后再使用 ldconfig 命令使得 动态链接库 为系统所共享(需要 root 权限)
  • 最后再次查看 ./test  的动态库是否被装载。
    • libcalc.so => /home/sustzc/lib/libcalc.so (0x00007fd00276b000)

动态库的优点

  • 库的体积小,系统只加载一次,被多个程序共用,节省内存空间。

动态库的缺点

  • 编译速度比静态库慢。

综上,动态库适用于对空间要求较高,而时间要求较低的程序中。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值