Gloox是一个开源的跨平台的C++实现的XMPP协议开发包,目前的版本为1.0测试版,不过由于是测试版,故在实际项目使用中不便于使用,故仍用0.9.9.5版本,这是一个比较稳定的版本,提供了很多的功能支持。
当从gloox的官网中下载0.9.9.5之后,解压。可以看见里面含有一个SRC的文件夹,里面就是gloox的所有的头文件和源文件了。
在编译gloox中,根据了解,可以编译成DLL动态库的方式,也可以编译成表态lib库的方式,不过我在使用过程中,发现DLL动态库好象不怎么稳定,且老是报一些错误,并且其他人在使用中也提到这个问题,所以一般没有考虑用DLL库。大多数的使用者都是使用的是lib库,这个lib库我编译出来的比较大,20多M,个人觉得太大了,用起来不方便,所以就直接通过加入源代码的方式进行开发了。
那么如何加入gloox源代码呢?我是这样做的。
新建一个项目如textgloox,然后在textgloox目录下新建一个目录,叫gloox,在该目录下加入解压gloox开发包之后的SRC文件夹下的所有文件,将这些头文件和源文件拷贝至textgloox下的gloox目录文件中,然后在你新建的项目中加入这些头文件和源文件就可以了。不过为了清晰所见,建议在你新建的项目中加入一个筛选器,名为gloox,然后将gloox中的所有头文件和源文件加入至该筛选器目录内。这样就可以将gloox与你的项目文件分隔开来,以便于管理。同时由于gloox库在运行时,本身需要一些库的支持,所以需要加入一些其他的库,这些库是: ws2_32.lib Secur32.lib Dnsapi.lib Crypt32.lib。当然可能有些库并不是必须的,我也只是根据网上别人的建议加入的,并没有一个一个排查,我的主要目的是使用这个库来做开发,而不是其它。
好了,当你经过上面的操作之后,就可以编译你的工程了,不过,此时会提示一个找不到config.h.win文件,这个很简单,可以在源文件中将其注释掉就可以了,这个是个编译选项的配置文件,具体的我没细看,不过我不是将其注释掉(我试过,注释掉也没问题),而是将这个文件(在你下载的gloox包中和SRC同一级目录下能找得到)拷贝至你的工程中的gloox目录中,然后在提示找不到这个文件的源文件中,将其路径改为gloox下就可以了,说白了,就是去掉里面的那个“../”即可。
经过上面的步骤之后,应该能够在你的工程中使用gloox进行开发了。我的示例环境如下,以方便前面的叙述。
在我这个示例项目中,gloox筛选器里面就是所有的gloox头文件和源文件,是从下载下来的gloox解压后的SCR目录下的所有文件拷贝过来的,同时还有一个config.h.win文件。
我的开发环境是vs2005,不过VC6上应该也能通过,因为是通过加入源文件的方式进行的。
另外在编译时可以会出现的一些问题:
1、建立工程。
新建一个mobile空工程。
加进文件就不多说了,将gloox的头文件、和cpp加进目录。
2、配置工程编译属性。
打开config.h,将config.h.win的目录由“../ config.h.win”改成“config.h.win”
2、设置工程属性。
这个根据需要自己配置一下,现在编译应该不用改也可以编译过,加到其他解决方案的时候可能会有问题,到时候看具体问题再具体改吧。
3、编译。
此时编译仍然会报错。解决如下:
1、/dns.cpp(346) : error C3861: 'getprotobyname': identifier not found
添加# include <winsock2.h>
添加#include <sstream>
2、error C2039: 'time' : is not a member of 'std'
将std::time(0)改为time(0) 去掉std
3、clientbase.cpp(502) : error C2440: '=' : cannot convert from 'unsigned char *' to 'unsigned short *'
错误,将char类型修改为short即可。
4、const std::string ClientBase::getID()中time没实现
改成:
#ifdef _WIN32_WCE
char r[8+1];
sprintf( r, "%08x", rand() );
std::string ret( r, 8 );
return std::string( "uid" ) + ret;
#else
std::ostringstream oss;
oss << ++m_idCount;
return std::string( "uid" ) + oss.str();
#endif