在Windows上编译jabberd2

最近要在Windows操作系统上架设一个IM服务器,选择的是jabberd2,选择在Windows上原因是在Linux上调试与Windows相比没有后者这么方便直观,也许这句话会使许多的linux的忠实粉丝有些不爽,我采用Linux调试的方法是写日志,遇到崩溃问题才会启用GDB调试,而在Windows上调试,可以让你很快了解程序的一个大体流程,随着可见调试的一步一步执行,加快对程序的理解。

然而在Windows上编译jabberd2可不是一件容易的事情,至少对我来说是这样的。我在网络上查阅了许多的资料,都没有相关的详尽资料,而官方则是提供jabberd2依赖库文件的源码下载地址(有十一个),让我怀疑他们是否真的在Windows上编译过。所以只能硬着头皮一个一个编译。

现在我就将我在windows上编译jabberd2的经验分享与大家,希望对大家有所帮助!

《一》准备源码

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)(以下的依赖源码都要这么做,以防出现异常情况,比如在C中声明int private会报错,因为private是C++中的关键字。),然后编译,提供libidn.lib,我编译的是静态库,可以在属性->配置属性->常规->配置类型中设置。然后将生产的库加入到jabberd2\win32\lib或jabberd2\win32\lib\debug目录下,建议放在debug目录下。

(2) libgsasl

下载源码,下载的版本是gsasl-0.2.28,更好的版本好似没有win32目录价,并且有些文件找不到,所以采用了这个版本,进入到lib\win32目录,打开libgsasl.sln,设置编译为C 代码(/TC),然后编译,提供libgsasl.lib,将lib文件拷贝到jabberd2\win32\lib\debug目录下。

(3) OpenSSL

下载源码,下载的版本是openssl-1.0.1e,编译这个比较繁琐,不过在网络上有很多这样的文章,这里提供两个链接供参考:
Windows环境下编译openssl - 天缘博客
在Windows下编译OpenSSL(VS2005) - 坐坐吧 - 51CTO技术博客
按照上面的做就会在产生两个目录夹,一个是out32和out32dll,这个两个文件分别存放了静态库和动态库,提供libeay32.lib ssleay32.lib这两个库给jabberd2.

(4) Expat
下载源码,下载的版本是expat-2.0.1,用Visual C++ 6.0编译,win32\bin\Debug目录下复制需要的库到jabberd2,提供的库是libexpat.lib。

(5) udns
下载源码,下载的版本是udns-0.2,这个是没有win32目录的,所以需要我们去下载补丁,补丁地址: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的当前目录产生一个win32目录,在其中就会有udns.sln,设置编译为C代码,笔译产生库,库存放在win32\lib\debug\static中,将udns.lib提供给jabberd2.

(6) zlib
下载源码,下载的版本是zlib-1.2.8,在contrib\vstudio\vc9目录下有zlibvc.sln,打开它设置为C代码编译。将工程配置为在x86上,而不是IA6上,也可以在网上搜索“Windows编译zlib",编译后会在contrib\vstudio\vc9\x86\ZlibDllDebug和contrib\vstudio\vc9\x86\ZlibStatDebug目录下,分别产生动态库和静态库。将库名更名为zlib1.lib给jabberd2。记住在使用库的时候一定在使用工程的预编译中设置ZLIB_WINAPI ASMV ASMINF,不然的话总是出现链接错误。

(7) MySQL
因为我已经有了mysql的头文件和库,所以不做阐述,如果需要的话可以到我的博客下载。只要提供mysql.lib给jabberd2。或者你们自己去下载源码然后编译,提供相应的头文件和库给jabberd2即可。

(8) SQLite
下载源码,下载的版本是sqlite-amalgamation-3080100,这个需要自己创建一个工程,并加源码中的文件加入到创建的工程中去,将工程配置为dll或是静态库都可以,编译产生sqlite3.lib放到jabberd中去。

(9)剩下其他三项式软件,下载下来安装即可,SVN主要是用来更新版本号。

《三》编译jabberd2
(1) 准备事宜
1 下载jabberd-2.2.16,找到win32\jabberd2.sln,打开,将每个工程都设为编译C代码。
2 准备好头文件,在工具-》选项-》VC++目录中去设置引用库的头文件目录,在这里设主要为了方便。当 然也可以在工程中设,但是这样做麻烦。因为有许多的工程,而且一旦重新做的话,又得重设引用头文件目录。
3 将jabberd2依赖的库全部放到win32\lib\debug中。

(2) 编译中的错误
(1)语法错误
这种错误主要是C语言在不同的编译器中引起的,比如
void func(int arg)
{
printf("hello world !");
int a,b;
}
这样就会报错,如果cpp文件就不会出现这个问题,.c文件在VC中编译,变量的声明一定要在局部区域的最前面。如改成
void func(int arg)
{
int a,b;
printf("hello world !");
}
就不会出问题。所以编译的时候出现了这种错误,都这样做。

(2)未定义的错误
出现未定义的错误就自己定义,比如SIGUSR1和SIGUSR2可以自己定义为:

define SIGUSR1 10

define SIGUSR2 15

还有一个是mode_t 可以自己定义为

define mode_t unsigned int

(3)文件找不到
如果出现文件找不到的情况,首先要到工程目录下去搜索是否存在这个文件,如果不存在,就将这个文件从工程中移除。

(4)链接错误
1 对应的库找不到
我的工程中的库的依赖关系是这样的,列入下:
(1)libraries下的jabberd2工程的库设置是:
zlib1.lib libgsasl.lib libeay32.lib ssleay32.lib dnsapi.lib ws2_32.lib libexpat.lib libidn.lib

(2)modules-》storage下的storage_mysql和storage_sqlite的库设置:
storage_mysql:libmysql.lib jabberd2.lib
storage_sqlite: sqlite3.lib jabberd2.lib

(3)services下的工程库设置:
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库设置:
所有都设置为:在原有的基础上加上两个storage_mysql.lib storage_sqlite.lib库。
2 声明的函数找不到实现,在jabberd2中有两个,第一个是strsep,其实现如下:

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,这个函数的定义其实已经实现,但是没有包含到jabberd2工程中去,所以你可以到工程目录下去搜索,然后添加到相应的工程去。 3 storage_mysql和storage_sqlite的链接错误 这个错误主要是因为找不到文件的实现导致的,所以在两个工程中加入object.c和storage.c文件到工程中去。

《四》 总结

这个编译过程花了3天的时间,编译的过程中出现许多的错误,曾多次想过放弃编译,因为真的是出现了太多的问题,有些问题莫名其妙,但还是坚持下来,因为每一次的修改编译,错误都在减少,都离成功更接近一步,如果放弃的话,那是永远不会成功。所以在这个过程当中给我一个很好的启发就是:成功真的要靠坚持和执着,不要为了逃避问题而去编制一些借口。这是我的一些心得,分享与大家,希望对大家有所帮助,同时你们也可以参阅这个链接:http://www.nanoant.com/portfolio/jabberd2-win32

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容