存档

文章标签 ‘eXosip’

关于库文件的搜索路径问题

三月 29th, {2010 1 条评论 9,237 人阅读过  

项目需要用到sip协议,虽然以前折腾飞信的时候用的也是sip,但不是标准的sip,自己去写一套标准的sip协议栈既浪费时间,又没有什么意思,于是想到了osip和exosip。

装了osip和exosip这两个库,在linux下安装下来就非常简单了,典型的三步曲就可以搞定。

写了个小程序测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <eXosip2/eXosip.h>
#include <netinet/in.h>
 
int main(int argc , char* argv[])
{
	int i;
	int port = 5060;
	TRACE_INITIALIZE(6 , stdout);
 
	i = eXosip_init();
 
	if(i != 0)
		return -1;
	i = eXosip_listen_addr(IPPROTO_TCP , NULL , port , AF_INET , 0);
 
	if(i != 0 )
	{
		eXosip_quit();
		fprintf(stderr , "can not initialize transport layer");
		return -1;
	}
	return 0;
}

编译:gcc -o exosip exosip.c -leXosip2 -DENABLE_TRACE

编译通过了,执行./exosip的时候却会报错:

./exosip: error while loading shared libraries: libeXosip2.so.4: cannot open shared object file: No such file or directory

./exosip: error while loading shared libraries: libosipparser2.so.4: cannot open shared object file: No such file or directory

./exosip: error while loading shared libraries: libosip2.so.4: cannot open shared object file: No such file or directory

很显然,程序找不到需要的这三个共享库,查了一个/usr/lib和/lib这两个目录里面果然没有,再查了一个/usr/local/lib,果然是安装在了那里面,以往都会在编译时设置环境变量LD_LIBRARY_PATH或者直接在/usr/lib目录下创建相关库文件的符号链接,想想太麻烦了,干嘛不设置一下库文件的搜索路径。

库文件搜索路径是在/etc/ld.so.conf中定义的,只需要在最后面加上一行/usr/local/lib就可以了

实际上程序在运行时并不是通过检查这个文件来定位所需要的头文件的,而是通过/etc/ld.so.cache这个文件来定位的,这个文件并不是明文的文本文件,它是ldconfig命令通过检查/etc/ld.so.conf生成的缓存文件,如果通过检查ld.so.conf中的路径来搜索库文件,执行效率未免太低,于是就生成一个缓存文件,通过它来定位所需要库文件。

ld.so.conf修改完之后必须用ldconfig来更新ld.so.cache,否则ld.so.conf改了也没用,另外ldconfig命令需要用root权限执行。

分类: Linux 标签: , ,