Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。
例程 foo.c:
- 编译:gcc -fPIC -c foo.c
- 链接:gcc -shared -o libfoo.so foo.o
例程 main_foo.c:
- 编译,链接 gcc -o main_foo main_foo.c -L. -lfoo
运行: ./main_foo 出错:
./main_foo: error while loading shared libraries: libfoo.so: cannotopen shared object file: No such file or directory
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
export LD_LIBRARY_PATH=/projects/lib
方法三:在编译目标代码时指定该程序的动态库搜索路径。
gcc -o main_foo main_foo.c -L. -lfoo-Wl,-rpath,/projects/lib
gcc -o main_foo main_foo.c -L. -lfoo-Wl,-rpath-link,/projects/lib
总结一下:Linux动态库的搜索路径搜索的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。