在Windows上編譯jabberd2

最近要在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喊暖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惫企,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子陵叽,更是在濱河造成了極大的恐慌狞尔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巩掺,死亡現(xiàn)場離奇詭異偏序,居然都是意外死亡,警方通過查閱死者的電腦和手機胖替,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門研儒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人独令,你說我怎么就攤上這事端朵〖” “怎么了娜搂?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵愉老,是天一觀的道長停忿。 經(jīng)常有香客問我,道長贤惯,這世上最難降的妖魔是什么老速? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任啊研,我火速辦了婚禮裙戏,結(jié)果婚禮上乘凸,老公的妹妹穿的比我還像新娘。我一直安慰自己挽懦,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布木人。 她就那樣靜靜地躺著信柿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醒第。 梳的紋絲不亂的頭發(fā)上渔嚷,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音稠曼,去河邊找鬼形病。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的漠吻。 我是一名探鬼主播量瓜,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼途乃!你這毒婦竟也來了绍傲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耍共,失蹤者是張志新(化名)和其女友劉穎烫饼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體试读,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡杠纵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钩骇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比藻。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伊履,靈堂內(nèi)的尸體忽然破棺而出韩容,到底是詐尸還是另有隱情,我是刑警寧澤唐瀑,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布群凶,位于F島的核電站,受9級特大地震影響哄辣,放射性物質(zhì)發(fā)生泄漏请梢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一力穗、第九天 我趴在偏房一處隱蔽的房頂上張望毅弧。 院中可真熱鬧,春花似錦当窗、人聲如沸够坐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽元咙。三九已至,卻和暖如春巫员,著一層夾襖步出監(jiān)牢的瞬間庶香,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工简识, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赶掖,地道東北人感猛。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像奢赂,于是被迫代替她去往敵國和親陪白。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容