美文网首页
在Windows上编译jabberd2

在Windows上编译jabberd2

作者: 一支笔2017 | 来源:发表于2017-07-05 21:26 被阅读0次

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

    相关文章

      网友评论

          本文标题:在Windows上编译jabberd2

          本文链接:https://www.haomeiwen.com/subject/hpqchxtx.html