– 动态库是可执行程序在运行,动态加载到进程内存中去.动态库与可执行程序是分离的两部分文件.–
两者作用完全等效,主要是使用方法不同.由开发者根据项目情况自行评估使用哪种形式.
创建动态链接库
动态链接库的创建分为两步:
– 1.编译目标文件,必须带上-fpic 标志,使输出的对象模块是按照可重定位地址方式生成的。
• gcc -c mystrlen.c -fpic
• gcc -c myshow.c -fpic
– 2.将加入动态库的目标文件合并在一起,必须带上-shared ,明确表示是动态链接库
• gcc -shared mystrlen.o myshow.o -o libstr.so
两步可以合并成一步,但一般不建议这样做
一步完成:
– gcc -fpic -shared mystrlen.c myshow.c -o libstr.so
so是Shared Object 的缩写
创建一个动态库的脚本
#!/bin/bash
#gcc -fpic -shared mystrlen.c myshow.c -o libstr.so
gcc -c -fpic mystrlen.c
gcc -c -fpic myshow.c
gcc -shared mystrlen.o myshow.o -o libstr.so #生成动态链接库
gcc -c main.c -I. #编译测试程序
#gcc main.o libstr.so -o main_so #链接主程序和动态库
gcc main.o -L. -lstr -o main_so #非标准链接方式
2.1运行中使用动态链接库:
一个使用动态链接库的程序运行时,要做一下设置.否则应用程序会报找不到动态库的错误
2.1.1隐式调用和显式调用两种调用方法:
– 隐式调用是不采用特殊系统调用,只是在gcc链接时采用-l,-L链接。这样对代码影响不大。
– 显式调用是在代码中加入一些特殊代码, 表示要调用哪个动态库程序。具有灵活的特点,缺点就是必须使用特定的,不可移植的系统调用来编写。过程比较复杂。
一个程序运行后,可以用命令ldd来检查它使用了哪一些动态库
– ldd ./hello
2.1.2隐式调用动态库的方法
如果让程序运行时能找动态链接库,Linux有如下几种方法.
– 把库所在路径加入/etc/ld.so.conf,程序加载时首先到这里路径查找
– 设置环境变量LD_LIBRARY_PATH,把库所在路径加入这个
变量中,这是最常用的方法
• 演示代码将采用这一方法运行,写一个脚本run_so.sh
#!/bin/sh
export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
./main_so
ldd ./main_so #用ldd查看用了哪些动态库
exit
隐式动态库的执行结果