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