因学习需要,欲安装基于osip库的Partysip proxy。下面是编译安装过程以及中途遇到的问题。
一、准备工作
1.osip库:libosip2-2.2.0.tar.gz
下载地址:http://ftp.gnu.org/gnu/osip/libosip2-2.2.0.tar.gz
2.partysip代码包:partysip-2.2.3.tar.gz
下载地址:http://download.savannah.gnu.org/releases/partysip/partysip-2.2.3.tar.gz
二、安装过程
1.下载安装osip库
# wget http://ftp.gnu.org/gnu/osip/libosip2-2.2.0.tar.gz
# tar xvfz libosip2-2.2.0.tar.gz
# cd libosip2-2.2.0
# ./configure
#make
# sudo make install
osip2库实际上包含了libosip2和libosipparser2两个库。
2.下载安装partysip
# wget http://download.savannah.gnu.org/releases/partysip/partysip-2.2.3.tar.gz
# tar xvfz partysip-2.2.3.tar.gz
# cd partysip-2.2.3
# ./configure
#make
# sudo make install
三、遇到的问题及解决办法
1.编译partysip时,make命令出错
错误提示:
/usr/bin/ld: osip_msg.o: undefined reference to symbol 'osip_atoi'
/usr/bin/ld: note: 'osip_atoi' is defined in DSO /usr/local/lib/libosipparser2.so.3 so try adding it to the linker command line
/usr/local/lib/libosipparser2.so.3: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
问题分析:
该问题是由于ld链接阶段,osip_msg.o模块使用到了库函数osip_atoi,而该函数在libosipparser2.so.3库中定义,但连接器找不到libosipparser2.so.3库,因为链接选项中没有指定该库。通过上面的gcc命令可以看出,其中只有libosip2,没有libosipparser2。所以解决办法就是修改makefile文件,找到链接参数中库声明的位置,手动添加libosipparser2库声明。
解决方法:
进入partysip-2.2.3/src目录,用文本编辑器打开目录下的makefile文件,找到partysip_LDFLAGS变量,在声明osip2库的位置后面添加 -losipparser2。保存修改,重新执行make命令。
关于CFLAGS,LDFLAGS,LIBS变量的意义,请参考:http://blog.csdn.net/caizi001/article/details/39401793
2.修复上面的问题后再次执行make命令出错
问题分析:
问题的原因与上面遇到的情况一样,但是/src/makefile中确实已经添加了 -losipparser2,没有遗漏,那么问题一定出在其他目录中的makefile上。通过回溯分析编译过程,发现有:
Making all in tools
make[2]: Entering directory `/root/Desktop/partysip-2.2.3/tools'
说明编译器进入了partysip-2.2.3/tools'目录,然后编译出错。那么很有可能是/tools/makefile中还有缺少对osipparser2库声明的地方。
解决方法:
进入partysip-2.2.3/src目录,用文本编辑器打开目录下的makefile文件,找到psp_users_LDFLAGS变量,在声明osip2库的位置后面添加 -losipparser2。保存修改,重新执行make命令。
另外亦可以参考:http://www.cnblogs.com/yeahgis/archive/2012/04/14/2446742.html
虽然具体环境不同,但遇到的问题有一定普遍性。
关于partysip的配置和使用,请参考后续文章。
==============================================================================================================================
下面是从其他帖子里粘过来的问题
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
in partysip-2.2.3/ path,
running "./configure && make"
will meet below error.
-----------------------------------------------------------------
make[2]: Entering directory `/home/b444/software/partySIP/partysip-2.2.3/tools'
/bin/bash ../libtool --mode=link gcc -DOSIP_MT -D_REENTRANT -D_THREAD_SAFE -DXOPEN_SOURCE=500 -DHAVE_GETADDRINFO -DNEW_TIMER -pedantic -DUSE_TMP_BUFFER -DDENABLE_DEBUG -g -DENABLE_TRACE -DPSP_SERVER_PREFIX=""/usr/local"" -DCONFIG_DIR=""/usr/local/etc/partysip"" -pthread -g -o psp_users -O -L/usr/local/lib -losip2 -module -avoid-version -export-dynamic psp_users.o ../ppl/unix/libppl.la -lnsl -ldl ../src/psp_config.o ../src/psp_utils.o
gcc -DOSIP_MT -D_REENTRANT -D_THREAD_SAFE -DXOPEN_SOURCE=500 -DHAVE_GETADDRINFO -DNEW_TIMER -pedantic -DUSE_TMP_BUFFER -DDENABLE_DEBUG -g -DENABLE_TRACE -DPSP_SERVER_PREFIX="/usr/local" -DCONFIG_DIR="/usr/local/etc/partysip" -g -o .libs/psp_users -O psp_users.o ../src/psp_config.o ../src/psp_utils.o -Wl,--export-dynamic -pthread -L/usr/local/lib /usr/local/lib/libosip2.so ../ppl/unix/.libs/libppl.so -lnsl -ldl -Wl,--rpath -Wl,/usr/local/lib
../ppl/unix/.libs/libppl.so: undefined reference to `__dn_expand'
../ppl/unix/.libs/libppl.so: undefined reference to `__res_query'
gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../.. -I../../ppl/unix -I/usr/local/include -Wall -Wcast-align -Wchar-subscripts -Wformat -Winline -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -DOSIP_MT -D_REENTRANT -D_THREAD_SAFE -DXOPEN_SOURCE=500 -DHAVE_GETADDRINFO -DNEW_TIMER -pedantic -DUSE_TMP_BUFFER -DENABLE_DEBUG -g -DENABLE_TRACE -g -MT groups_core.lo -MD -MP -MF .deps/groups_core.Tpo -c groups_core.c -o groups_core.o >/dev/null 2>&1
/bin/bash ../../libtool --mode=link gcc -DOSIP_MT -D_REENTRANT -D_THREAD_SAFE -DXOPEN_SOURCE=500 -DHAVE_GETADDRINFO -DNEW_TIMER -pedantic -DUSE_TMP_BUFFER -DENABLE_DEBUG -g -DENABLE_TRACE -g -o libpsp_groups.la -rpath /usr/local/lib/partysip/ -module -avoid-version -export-dynamic -L/usr/local/lib -losip2 -lnsl -ldl groups.lo groups_core.lo
gcc -shared .libs/groups.o .libs/groups_core.o -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib -L/usr/local/lib /usr/local/lib/libosip2.so -lnsl -ldl -Wl,-soname -Wl,libpsp_groups.so -o .libs/libpsp_groups.so
ar cru .libs/libpsp_groups.a groups.o groups_core.o
-----------------------------------------------------------------
Add -lresolv in below 2 Makefils
partysip-2.2.3/Makefile
partysip-2.2.3/tools/Makefile
-----------------------------------------------------------------
PARTYSIP_LIB = -lnsl -ldl -lresolv
PATH_SEPARATOR = :
PPL_FLAGS = -DOSIP_MT -D_REENTRANT -D_THREAD_SAFE -DXOPEN_SOURCE=500 -DHAVE_GETADDRINFO -DNEW_TIMER -pedantic -DUSE_TMP_BUFFER -DENABLE_DEBUG -g -DENABLE_TRACE
PPL_LIB = -lnsl -ldl -lresolv
-----------------------------------------------------------------
And then at partysip-2.2.3/ directory, run "make"
==================================================================
if saw the following errors
/usr/bin/ld: sip2ims.o: undefined reference to symbol ‘osip_atoi’
/usr/bin/ld: note: ‘osip_atoi’ is defined in DSO /usr/local/lib/libosipparser2.so.3 so try adding it to the linker command line
/usr/local/lib/libosipparser2.so.3: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
Solution: add “-losipparser2″ in the Makefile to like the needed library in.
Then the executable “sip2ims” is made successfully.
==================================================================