目录
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)
动态库的优点
- 库的体积小,系统只加载一次,被多个程序共用,节省内存空间。
动态库的缺点
- 编译速度比静态库慢。
综上,动态库适用于对空间要求较高,而时间要求较低的程序中。