1.动态库静态库的生成
编译生成静态库步骤:
第一步,生成目标文件。
gcc -c test.c
第二步,把目标文件归档。
ar r libtest.a test.o
file libtest.a
编译生成动态库步骤:
gcc demo.c -fPIC -shared -o libtest.so
由以上命令生成动态库libtest.so,为了不需要动态加载动态库,在命令时需以lib开头以.so为后缀。
–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
–shared:指明编译成动态库。
2.动态库静态库的链接编译链接静态库
gcc demo.c -ltest -L. -static -o demo
编译链接动态库
gcc test.c –L . –ltest –o test
-L:指明动态库所在的目录
-l:指明动态库的名称,该名称是处在头lib和后缀.so中的名称,如上动态库libtest.so的l参数为-l test。
-ltest -L./lib 指定链接库路径
-wl,-rpath /home/Tim/demo/lib 指定搜索链接库路径
-wl,-Bstatic 后面的-l使用静态库链接
-wl,-Bdynamic 后面的-l使用动态库连接
显式加载与隐式加载
显式加载通过编译是链接符号表,运行时由系统搜索加载动态库
隐式加载通过程序运行时调用下面几个系统调用手动加载动态库
dlopen 用于库的打开 dlerror 用于错误检测 dlsym 用于获取库中函数指针 dlclose 关闭动态库,手动加载动态库
3.动态库静态库的加载
ldd test 查看执行程序的动态库依赖
nm libtest.so 查看动态库的符号
strings libtest.so 查看动态库中字符串
strip libtest.so 脱去动态库中符号信息
sudo lsof -p pid 查看运行进程的动态库依赖
env 查看当前shell用户环境变量
sudo env 查看切换sudo环境变量
export ld_library_path 配置动态库路径
pkg-config 配置搜索动态库路径命令
vi /etc/profile 配置环境变量到系统配置文件
source /etc/profile 使系统配置文件立即生效
vi ld.so.conf 查看系统动态库共享目录配置
sudo ldconfig 使系统动态库共享目录生效
sudo visudo 修改执行sudo切换时保留当前用户shell环境
sudo cat /etc/sudoers
Defaults env_keep+="ld_library_path"
4.参考资料
http://man.linuxde.net/ldconfig
http://blog.chinaunix.net/uid-24641004-id-5028821.html
https://www.cnblogs.com/zhangsir6/articles/2956798.html