最近在参与一个xmpp协议相关的项目,要找一个c下面的xmpp的库帮助开发。在xmpp.org上c库少的可怜。iksemel太过底层,就是一个xml的解析器,只不过是支持jabber而已,网络连接、登录都是要自己编写的;libstrophe找不到手册,唯一找到的好像是给javascript的;最后也就看到了loudmouth这个家伙。现在的版本是1.4.3。
 
原来没有做过这种层次的工作,这是第一次,过程中必然会碰到一些问题。我就写写我的学习过程以及碰到问题,当然还有解决办法了!
 

1.学习xmpp


首先是要学习xmpp协议,主要是RFC3920[XMPP-CORE]和RFC3921[XMPP-IM]这两个。老板推荐的xmpp的论文觉得的确很好:
 
<Extensible Messaging and Presence Protocol>    
by Mikko Laukkanen
 
基本上看了这篇论文就对xmpp有一个比较好的认识了。
我们办公室的服务器就有xmpp的server,所以可以直接找一个client登录看看,没有的话gtalk就是基于xmpp的拉。(应该是吧)
 

2.loudmouth库的编译和安装


安装过程主要就是linux三部曲
 
./configure
make
make install
 
但是我在./configure的时候出问题了,报错说glib版本过低。最后我是在vmware里装了一个ubuntu9.04,后安装glib2.13到/usr目录,即可编译通过。这里安装过程我写的比较简单,掠过了几个地方,比如,如果以前有过glib,但是版本比较低的话,我建议如果可以,重新安装一个比较新版本的linux会比较好,因为我曾经在rh9上碰到了glib版本太低的问题,当时花了一些时间想对glib升级,最后还是重装了一个ubuntu才解决。记得最好是装在/usr下,也就是在glib的./configure时加入参数--prefix=/usr。
 

3.loudmouth的调用


这样就ok了,可以直接到examples目录下跑跑测试程序。但是这里发现了一个问题,就是库自带的测试程序都非常奇怪,一个个的bash程序,然后里边再ooxx,总之examples下的makefile非常复杂,是自动生成的。
 
这里我碰到了一个问题,就是我们自己的程序里如何调用loudmouth的函数呢?
写一个test.c包含一下试试:
 
// test.c
#include<loudmouth/loudmouth.h>
int main(void){
                return 0;
}
 
这个直接gcc是不行的,要加一些目录包含的参数(这里注意,需要loudmouth自己的目录,还需要glib的)。我写了一个简单的Makefile:
 
project = test
$(project) : $(project).c
        gcc -o $@ -I/usr/local/include/loudmouth-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -L/usr/local/lib -lloudmouth-1 $<
 
 
放在test.c目录下,make就可以了。
 
这还不行,运行的时候还会发现下面的错误:
 
error while loading shared libraries: libloudmouth-1.so.0: cannot open shared object file: No such file or directory
 
这是ldconfig的问题,具体的请google ldconfig。通过以下命令解决之:
 
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
 
这样就可以运行了。
 

4.其他


关于loudmouth的具体使用,在它的包里边有详细的html格式的手册,觉得好像还是挺好用的。
 
这里推荐大家一个很好的code编辑和阅读的软件,source insight,除了编辑方式上我觉得比vim差一些,其他的觉得都很好用,个人觉得比我使用vim+ctags+tlist方便一些。(当然,我根本没怎么用vim编过大程序,更别提我用的方法上可能有很多欠缺……总之大家可以试试这个insight就是了。它本身就可以查看函数的调用情况等等地方,还是很方便的)
 
之后可能需要将这个东西放到arm上跑……现在还没概念,不知道glib会不会又给我找事……有不祥的预感啊,不过以后再说吧。
 
2009.7.7 by Peter.Xu