最近在參與一個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