当前位置: 技术问答>linux和unix
动态库加载的问题
来源: 互联网 发布时间:2015-03-29
本文导语: 请问一下: 我自己编写了一个动态库,名字mylib.so 存放路径为/home/mellven/mylib.so 并修改“动态链接库的配置文件”(/etc/ld.so.conf): …… /home/mellven …… 使用ldconfig -v,打印出来的动态库中没有mylib.so 是不是必须...
请问一下:
我自己编写了一个动态库,名字mylib.so
存放路径为/home/mellven/mylib.so
并修改“动态链接库的配置文件”(/etc/ld.so.conf):
……
/home/mellven
……
使用ldconfig -v,打印出来的动态库中没有mylib.so
是不是必须是以lib开头的动态库才能被加入系统默认搜索路径?
那如果我一定要将非lib开头的动态库加载进系统默认搜索路径,该怎么做呢?
谢谢英雄们!!!
我自己编写了一个动态库,名字mylib.so
存放路径为/home/mellven/mylib.so
并修改“动态链接库的配置文件”(/etc/ld.so.conf):
……
/home/mellven
……
使用ldconfig -v,打印出来的动态库中没有mylib.so
是不是必须是以lib开头的动态库才能被加入系统默认搜索路径?
那如果我一定要将非lib开头的动态库加载进系统默认搜索路径,该怎么做呢?
谢谢英雄们!!!
|
首先你要明白ldconfig是为/etc/ld.so.conf里边指定的路径下的所有so(共享库)生成运行时的cache及/usr/lib,/lib下的符号连接(这些被称为动态库依赖)。
而这个符号连接名同原有的库名是不一样的。
这个符号连接名是在编译时传给ld的一个参数指定的,如:
gcc -o mylib.so --share -soname=mylib.so.1 mylib.c
如果没有指定,那么即使ld.so.conf中有mylib.so的路径,ldconfig也不会生成/usr/lib下的符号连接mylib.so.1。这时,你也不用担心,你可以自己做一个/usr/lib下的符号连接,然后在gcc中指定-l。
最后最直接的办法直接加-L/home/mellven -lmylib 并将mylib.so该名为libmylib.so.
从之上可以看出ldconfig其实是为了让动态库方便的实现不同版本的切换,不被版本号困扰。
比如 如果指定mylib.so.1为soname,1代表版本。那么当你重新编译mylib.so,指定mylib.so.2为soname后,ldconfig之后,/usr/lib/mylib.so.2还是指向最新的mylib.so而,/usr/lib/mylib.so.1也指向了最新的2.0版本。这样保证以前所写的使用1.0的程序不会出现找不到库的问题。
而这个符号连接名同原有的库名是不一样的。
这个符号连接名是在编译时传给ld的一个参数指定的,如:
gcc -o mylib.so --share -soname=mylib.so.1 mylib.c
如果没有指定,那么即使ld.so.conf中有mylib.so的路径,ldconfig也不会生成/usr/lib下的符号连接mylib.so.1。这时,你也不用担心,你可以自己做一个/usr/lib下的符号连接,然后在gcc中指定-l。
最后最直接的办法直接加-L/home/mellven -lmylib 并将mylib.so该名为libmylib.so.
从之上可以看出ldconfig其实是为了让动态库方便的实现不同版本的切换,不被版本号困扰。
比如 如果指定mylib.so.1为soname,1代表版本。那么当你重新编译mylib.so,指定mylib.so.2为soname后,ldconfig之后,/usr/lib/mylib.so.2还是指向最新的mylib.so而,/usr/lib/mylib.so.1也指向了最新的2.0版本。这样保证以前所写的使用1.0的程序不会出现找不到库的问题。