分类:
2011-07-02 20:29:23
原文地址:linux 动态链接库 作者:fireworks2
By fireworks2@foxmail.com
找了大半天,都是些长篇大论,却也说不清楚的文章,自己简化了一下,列在下面了。
生成示例:g++ -fPIC -shared -g -o libtest.so lib.cpp
使用:
1. 编译可执行文件
此时库的搜索目录为 -L 指定的路径,以及 g++ -print-search-dirs 打印的库搜索路径。
把库放到默认搜索路径或者通过-L指定均可。
2. 运行可执行文件
编译时的搜索目录和执行时的搜索目录是两回事,要知道编译通过后仍然可能无法执行。
运行时查找相应的库,OS会依次查看以下路径:
(1) 用户环境变量中的LD_LIBRARY_PATH值;
(2) 动态链接缓冲文件/etc/ld.so.cache
(3) 目录/lib,/usr/lib
执行 ldd 就可以看到搜索到的结果。
根据上面的搜索路径,将库或者库的软链接放到合适路径就可以了。
不过如果编译时直接列出完整的so路径(如 g++ -o test ./libtest.so test.cpp),那也ok。这是为什么呢?因为这么编译的话,共享库的路径信息已经写入了a.out,当然可以找到了!
3. ldconfig
该工具管理各个动态链接库的目录明细,对应的配置文件默认为 /etc/ld.so.conf。
当用户在某个目录下面创建或拷贝了一个动态链接库,若想使其被系统共享,可以执行一下"ldconfig 目录名"这个命令。此命令的功能在于让ldconfig将指定目录下的动态链接库被系统共享起来,意即:在缓存文件 /etc/ld.so.cache中追加进指定目录下的共享库。不过下次更新cache可能被冲掉,导致找不到。
执行ldconfig可以刷新ld.so.cache文件。