动态库制作与使用


命令规则Llinux libxxx.so win: libxxx.dll

1. 制作:gcc -c -fpic a.c b.c 位置无关的代码

2 . 得到动态库

  ` gcc -shared a.o b.o  -o libcalc.so

示例:

1.  `gcc -c -fpic add.c div.c mult.c  sub.c ` 

2.  `gcc -shared *.o -o libcalc.so`

3.使用 

` gcc main.c -o main -I include/ -l calc -L lib/`

 因为静态库会打包到可执行文件,但是动态库不会,所以运行的时候才会吧动态库加载到内存中。 

使用ldd查看可执行文案依赖的动态库

动态库获取的顺序:

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路 径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是 由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量 LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib 目录找到库文件后将其载入内存

第一中动态连接方式  LD_LIBRARY_PATH 

查看` echo $LD_LIBRARY_PATH` 

拼接环境变量:`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/linux-webserver/lesson06/library/lib`

 这种方式与终端有关,是临时的

永久性配置的方法。

用户级别的设置

`vim ~.bashrc`

添加` export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/linux-webserver/lesson06/library/lib`

激活 `. .bashrc ` .就是source 激活的意思

系统级别的配置:

`sudo vim /etc/profile` 后面一样

第二章方式: /etc/ld.so.cache 

`sudo vim /etc/ld.so.conf`

`sudo ldconfig`

 第三第四种,把库文件放到 /lib/ /user/liv目录,但是不推荐