f01 动态库的制作
命名规则:libxxx.so(可执行文件)
lib:固定前缀
xxx:动态库的名字
.so:固定后缀
动态库的制作过程
gcc 得到.o文件,在这里得到的.o文件必须是和位置无关的代码
gcc -c -fpic xxx.c xxx.c xxx.c ..........
gcc得到动态库
gcc -shared xxx.o xxx.o xxx.o ....... -o libxxx.so
简单举例:
在进行创建完动态库的时候,我对文件进行了简单的分类归纳
在这个文件中,对main.c文件进行了可执行程序的生成:
把main.c文件生成了可执行程序app,但是此时app这个可执行程序并不能运行,这源于动态库的工作原理与静态库不同,它需要找到一个路径,此时我们并没有在环境中添加动态库的绝对路径,在找不到路径的情况下,是无法成功运行动态库的。所以要想成功运行程序,我们首先要了解以下动态库的工作原理。
02 动态库的工作原理
动态库进行链接时,动态库的代码不会被打包到可执行程序中,在程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库的依赖关系,与静态库不同的是,当系统加载可执行代码的时候,必须知道其所依赖的库的名字的同时,还需要知道库的绝对路径,此时就需要系统的动态载入器来获取绝对路径。
对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段 、环境变量LD_LIBRARY_PATH、/etc/ld.so.cache文件列表、/lib/、/usr/lib目录找到库文件之后将它加载到内存中。
- 方法1:在环境变量LD_LIBRARY_PATH中插入动态库的绝对路径
输入 以下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[动态库的绝对路径]
/*动态库的绝对路径查找方法:
进入到动态库所在的文件夹,然后输入pwd命令,即可查找到绝路径
完成之后可以利用ldd <可执行程序名称>来查看是否加入成功,如果成功会有以下显示
在libcalc.so这一行会显示绝对路径,之后便可直接运行我们的可执行代码。这个方法是在我们终端中配置的,如果关掉终端,这个路径将会失效,所以这个方法是临时的。
要想永久的配置路径,可以用以下方法:
用户级别:在我们的用户目录下有一个.bashrc文件,我们可以在这个文件中直接配置
用vim进入到.bashrc文件中,在最后面加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<动态库的绝对路径>
添加完成后,需要使修改生效
source .bashrc
这样用户级别的配置就完成了
同样,系统级别也可以配置路径,但是在系统级别配置就需要使用权限,具体方法与用户级别差不多
sudo vim /etc/profile
在这个文件中插入
保存退出 然后source一下就可以了
- 方法2:利用/etc/ld.so.cache文件列表配置
/etc/ld.so.cache这个文件是一个二进制文件,所以我们需要间接的取更改它,在用户目录下找到这个文件:
sudo vim /etc/ld.so.conf
在这个文件中配置即可,直接将路径粘贴在该文件中 ,保存退出然后source即可