最近要在Windows操作系統(tǒng)上架設(shè)一個IM服務(wù)器,選擇的是jabberd2卑惜,選擇在Windows上原因是在Linux上調(diào)試與Windows相比沒有后者這么方便直觀,也許這句話會使許多的linux的忠實粉絲有些不爽,我采用Linux調(diào)試的方法是寫日志,遇到崩潰問題才會啟用GDB調(diào)試萍肆,而在Windows上調(diào)試,可以讓你很快了解程序的一個大體流程胀屿,隨著可見調(diào)試的一步一步執(zhí)行塘揣,加快對程序的理解。
然而在Windows上編譯jabberd2可不是一件容易的事情宿崭,至少對我來說是這樣的勿负。我在網(wǎng)絡(luò)上查閱了許多的資料,都沒有相關(guān)的詳盡資料劳曹,而官方則是提供jabberd2依賴庫文件的源碼下載地址(有十一個),讓我懷疑他們是否真的在Windows上編譯過琅摩。所以只能硬著頭皮一個一個編譯铁孵。
現(xiàn)在我就將我在windows上編譯jabberd2的經(jīng)驗分享與大家,希望對大家有所幫助房资!
《一》準備源碼
1 下載jabberd-2.2.16(以這個版本說明)蜕劝。
2 下載jabberd2包中README.win32中列出的源碼或是軟件。
《二》列表說明
jabberd2需要README.win32文件提供的源碼或軟件共11個轰异,下面我們按照README.win32文件的順序一個一個的說明岖沛。
(1) libidn
先下載源碼,我下載的是libidn-1.7搭独,然后解壓婴削,進入到win32,打開libidn.sln牙肝,將配置屬性->C/C++->高級->編譯為->編譯為 C 代碼(/TC)(以下的依賴源碼都要這么做唉俗,以防出現(xiàn)異常情況,比如在C中聲明int private會報錯配椭,因為private是C++中的關(guān)鍵字虫溜。),然后編譯股缸,提供libidn.lib衡楞,我編譯的是靜態(tài)庫,可以在屬性->配置屬性->常規(guī)->配置類型中設(shè)置敦姻。然后將生產(chǎn)的庫加入到j(luò)abberd2\win32\lib或jabberd2\win32\lib\debug目錄下瘾境,建議放在debug目錄下歧杏。
(2) libgsasl
下載源碼,下載的版本是gsasl-0.2.28寄雀,更好的版本好似沒有win32目錄價得滤,并且有些文件找不到,所以采用了這個版本盒犹,進入到lib\win32目錄懂更,打開libgsasl.sln,設(shè)置編譯為C 代碼(/TC)急膀,然后編譯沮协,提供libgsasl.lib,將lib文件拷貝到j(luò)abberd2\win32\lib\debug目錄下卓嫂。
(3) OpenSSL
下載源碼慷暂,下載的版本是openssl-1.0.1e,編譯這個比較繁瑣晨雳,不過在網(wǎng)絡(luò)上有很多這樣的文章行瑞,這里提供兩個鏈接供參考:
Windows環(huán)境下編譯openssl - 天緣博客
在Windows下編譯OpenSSL(VS2005) - 坐坐吧 - 51CTO技術(shù)博客
按照上面的做就會在產(chǎn)生兩個目錄夾,一個是out32和out32dll餐禁,這個兩個文件分別存放了靜態(tài)庫和動態(tài)庫血久,提供libeay32.lib ssleay32.lib這兩個庫給jabberd2.
(4) Expat
下載源碼,下載的版本是expat-2.0.1帮非,用Visual C++ 6.0編譯氧吐,win32\bin\Debug目錄下復制需要的庫到j(luò)abberd2,提供的庫是libexpat.lib末盔。
(5) udns
下載源碼筑舅,下載的版本是udns-0.2,這個是沒有win32目錄的陨舱,所以需要我們?nèi)ハ螺d補丁翠拣,補丁地址:http://www.nanoant.com/portfolio/jabberd2-win32,下載的文件是udns-0.0.9-win32-VC8.patch游盲。如果熟悉Linux的話心剥,把udns上傳到Linux,并將這個補丁放到udns的目錄夾中背桐。利用命令patch -p0 < udns-0.0.9-win32-VC8.patch优烧,就會在udns的當前目錄產(chǎn)生一個win32目錄,在其中就會有udns.sln链峭,設(shè)置編譯為C代碼畦娄,筆譯產(chǎn)生庫,庫存放在win32\lib\debug\static中,將udns.lib提供給jabberd2.
(6) zlib
下載源碼熙卡,下載的版本是zlib-1.2.8杖刷,在contrib\vstudio\vc9目錄下有zlibvc.sln,打開它設(shè)置為C代碼編譯驳癌。將工程配置為在x86上滑燃,而不是IA6上,也可以在網(wǎng)上搜索“Windows編譯zlib"颓鲜,編譯后會在contrib\vstudio\vc9\x86\ZlibDllDebug和contrib\vstudio\vc9\x86\ZlibStatDebug目錄下表窘,分別產(chǎn)生動態(tài)庫和靜態(tài)庫。將庫名更名為zlib1.lib給jabberd2甜滨。記住在使用庫的時候一定在使用工程的預(yù)編譯中設(shè)置ZLIB_WINAPI ASMV ASMINF乐严,不然的話總是出現(xiàn)鏈接錯誤。
(7) MySQL
因為我已經(jīng)有了mysql的頭文件和庫衣摩,所以不做闡述昂验,如果需要的話可以到我的博客下載。只要提供mysql.lib給jabberd2艾扮〖惹伲或者你們自己去下載源碼然后編譯,提供相應(yīng)的頭文件和庫給jabberd2即可泡嘴。
(8) SQLite
下載源碼呛梆,下載的版本是sqlite-amalgamation-3080100,這個需要自己創(chuàng)建一個工程磕诊,并加源碼中的文件加入到創(chuàng)建的工程中去,將工程配置為dll或是靜態(tài)庫都可以纹腌,編譯產(chǎn)生sqlite3.lib放到j(luò)abberd中去霎终。
(9)剩下其他三項式軟件,下載下來安裝即可升薯,SVN主要是用來更新版本號莱褒。
《三》編譯jabberd2
(1) 準備事宜
1 下載jabberd-2.2.16,找到win32\jabberd2.sln涎劈,打開广凸,將每個工程都設(shè)為編譯C代碼。
2 準備好頭文件蛛枚,在工具-》選項-》VC++目錄中去設(shè)置引用庫的頭文件目錄谅海,在這里設(shè)主要為了方便。當 然也可以在工程中設(shè)蹦浦,但是這樣做麻煩扭吁。因為有許多的工程,而且一旦重新做的話,又得重設(shè)引用頭文件目錄侥袜。
3 將jabberd2依賴的庫全部放到win32\lib\debug中蝌诡。
(2) 編譯中的錯誤
(1)語法錯誤
這種錯誤主要是C語言在不同的編譯器中引起的,比如
void func(int arg)
{
printf("hello world !");
int a,b;
}
這樣就會報錯枫吧,如果cpp文件就不會出現(xiàn)這個問題浦旱,.c文件在VC中編譯,變量的聲明一定要在局部區(qū)域的最前面九杂。如改成
void func(int arg)
{
int a,b;
printf("hello world !");
}
就不會出問題颁湖。所以編譯的時候出現(xiàn)了這種錯誤,都這樣做尼酿。
(2)未定義的錯誤
出現(xiàn)未定義的錯誤就自己定義爷狈,比如SIGUSR1和SIGUSR2可以自己定義為:
define SIGUSR1 10
define SIGUSR2 15
還有一個是mode_t 可以自己定義為
define mode_t unsigned int
(3)文件找不到
如果出現(xiàn)文件找不到的情況,首先要到工程目錄下去搜索是否存在這個文件裳擎,如果不存在涎永,就將這個文件從工程中移除。
(4)鏈接錯誤
1 對應(yīng)的庫找不到
我的工程中的庫的依賴關(guān)系是這樣的鹿响,列入下:
(1)libraries下的jabberd2工程的庫設(shè)置是:
zlib1.lib libgsasl.lib libeay32.lib ssleay32.lib dnsapi.lib ws2_32.lib libexpat.lib libidn.lib
(2)modules-》storage下的storage_mysql和storage_sqlite的庫設(shè)置:
storage_mysql:libmysql.lib jabberd2.lib
storage_sqlite: sqlite3.lib jabberd2.lib
(3)services下的工程庫設(shè)置:
c2s: jabberd2.lib libidn.lib ws2_32.lib
s2s: jabberd2.lib udns.lib ws2_32.lib libidn.lib
sm: jabberd2.lib libeay32.lib libidn.lib ws2_32.lib zlib1.lib storage_mysql.lib storage_sqlite.lib
router: jabberd2.lib ws2_32.lib
(4)modules-》mod庫設(shè)置:
所有都設(shè)置為:在原有的基礎(chǔ)上加上兩個storage_mysql.lib storage_sqlite.lib庫羡微。
2 聲明的函數(shù)找不到實現(xiàn),在jabberd2中有兩個惶我,第一個是strsep妈倔,其實現(xiàn)如下:
char *strsep(char **stringp, const char *delim)
{
char *s;
const char *spanp;
int c, sc;
char *tok;
if ((s = *stringp)== NULL)
return (NULL);
for (tok = s;;) {
c = s++;
spanp = delim;
do {
if ((sc =spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
stringp = s;
return (tok);
}
} while (sc != 0);
}
/ NOTREACHED */
}
第二個是c2s_pbx_init,這個函數(shù)的定義其實已經(jīng)實現(xiàn)绸贡,但是沒有包含到j(luò)abberd2工程中去盯蝴,所以你可以到工程目錄下去搜索,然后添加到相應(yīng)的工程去听怕。 3 storage_mysql和storage_sqlite的鏈接錯誤 這個錯誤主要是因為找不到文件的實現(xiàn)導致的捧挺,所以在兩個工程中加入object.c和storage.c文件到工程中去。
《四》 總結(jié)
這個編譯過程花了3天的時間尿瞭,編譯的過程中出現(xiàn)許多的錯誤闽烙,曾多次想過放棄編譯,因為真的是出現(xiàn)了太多的問題声搁,有些問題莫名其妙黑竞,但還是堅持下來,因為每一次的修改編譯疏旨,錯誤都在減少很魂,都離成功更接近一步,如果放棄的話檐涝,那是永遠不會成功莫换。所以在這個過程當中給我一個很好的啟發(fā)就是:成功真的要靠堅持和執(zhí)著霞玄,不要為了逃避問題而去編制一些借口。這是我的一些心得拉岁,分享與大家坷剧,希望對大家有所幫助,同時你們也可以參閱這個鏈接:http://www.nanoant.com/portfolio/jabberd2-win32喊暖。