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