命名规则:
Linux:libxxx.so
lib:前缀
xxx:名称
.so:后缀
在linux下是一个可执行文件
windows:
libxxx.dll
制作过程:
1.gcc/g++ 获得.o文件 得到和位置无关的代码 例如
gcc -c -fpic/-fPIC mycode.c
-fpic/-fPIC 得到和位置无关
2.得到动态库
gcc -shared mycode.o -o mycode.so
-shared : 生成目标共享文件,通常在建立共享库时。
3.运行
gcc main.c -o main -I ./include -l calc -L ./lib
此时发现无法运行 提示无法找到动态库
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
这是因为静态库和动态库工作原理不同。静态库在程序链接阶段被复制到程序中;动态库在链接阶段没有被复制到程序中,而是在程序运行时由系统动态加载到内存中供程序调用。就是说在程序链接时动态库不会被打包到可执行程序中。只有程序调用了动态库的API时,动态库才会加载到程序当中。
通过 ldd (list dynamic dependencies)命令检查动态库依赖关系 列出可执行程序的动态库地址
ldd main
gzq@gzq:~/myproject/lesson06/library$ ldd main
linux-vdso.so.1 (0x00007ffcd5162000)
libcalc.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f060dc63000)
/lib64/ld-linux-x86-64.so.2 (0x00007f060e256000)
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/,/usr/lib目录找到库文件后将其载入内存。
gzq@gzq:~$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gzq/myproject/lesson06/library/lib
gzq@gzq:~$ echo $LD_LIBRARY_PATH
::/home/gzq/myproject/lesson06/library/lib
gzq@gzq:~/myproject/lesson06/library$ ldd main
linux-vdso.so.1 (0x00007ffe31fec000)
libcalc.so => /home/gzq/myproject/lesson06/library/lib/libcalc.so (0x00007f749e172000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f749dd81000)
/lib64/ld-linux-x86-64.so.2 (0x00007f749e576000)
在环境变量里配置动态库的绝对路径后 动态库就可以找到了 程序即可正常运行。(此方法在当前终端关闭后就无效了 每次打开新终端都需要配置一遍)
永久配置方法 用户级别配置、系统级别配置
用户级别:终端输入 ll 进入home目录 找到.bashrc隐藏文件 vim.bashrc编辑
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/gzq/myproject/lesson06/library/lib
最后一行插入路径。配置完成后更新一下
source .bashrc
回到程序目录 ldd查看发现已经成功。
gzq@gzq:~/myproject/lesson06/library$ ldd main
linux-vdso.so.1 (0x00007ffcef3bd000)
libcalc.so => /home/gzq/myproject/lesson06/library/lib/libcalc.so (0x00007fd6f96f0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd6f92ff000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd6f9af4000)
系统级别
$ sudo vim /etc/profile
编辑和更新同上。
配置/etc/ld.so.cache方法
sudo vim /etc/ld.so.conf 将路径添加到下方即可。
include /etc/ld.so.conf.d/*.conf
/home/gzq/myproject/lesson06/library/lib
sudo ldconfig 更新一下 即可成功
gzq@gzq:~/myproject/lesson06/library$ ldd main
linux-vdso.so.1 (0x00007ffdfb338000)
libcalc.so => /home/gzq/myproject/lesson06/library/lib/libcalc.so (0x00007f8543951000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8543560000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8543d55000)