Mac OS环境下编译使用Gloox

一、gloox简介 gloox是一个多功能的 C++ XMPP library,主要的新功能包括: - 完整的 MUC 支持 - 文件传输 (XEPs 0065, 0095, 0096) - XPath支持 更多信息参http://camaya.net/gloox 二、准备工作 操作系统:Mac OS 10.5.3 编译器:gcc 4.0 编译Gloox需要的源代码包有: gloox http://camaya.net/glooxdownload libidn http://www.gnu.org/software/libidn/ guntls http://www.gnu.org/software/gnutls/ openssl http://www.openssl.org/ zlib http://www.zlib.net/ libgpg-error ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.6.tar.bz2 libgcrypt http://mirrors.rootmode.com/ftp.gnupg.org/libgcrypt/ 三、编译gloox 在GNU开源项目中,标准的编译安装步骤是: 1、解压源代码包文件,命令为: tar xvf XXX.tar 解压以tar结尾的文件 tar jxvf XXX.tar.bz2 解压以tar.bz结尾的文件 tar zxvf XXX.tar.gz 解压以tar.gz结尾的文件 2、进入解压后的文件目录,运行 ./configure 3、编译源代码 make 4、安装 make install 编译后默认的安装位置是/usr/local 目录,即头文件放在/usr/local/include ,库文件放在/usr/local/lib,但在make install的时候会报“ Permission denied”的错误(如图1)。原因是在mac os上用户是没有权限在/usr/local/目录上做修改。这时我们可以重新设置安装目录,以$HOME/src目录为例,重新运行. /configure使用--prefix指明其安装路径 ./configure --prefix=$HOME/src 然后在运行 make;make install 图1 Premission denied 错误 设置package路径 当我们编译安装完一个库后,往往会生成一个以.pc结尾的文件,这个文件包含了这个库的一些基本信息,如安装路径(prefix),头文件路径(includedir),库文件路径(libdir)等等。通过这个文件,系统就能够识别到已经安装了这个库。但您需要先设置 PKG_CONFIG_PATH环境变量(假如.pc文件路径为${HOME}/src/lib/pkgconfig) export PKG_CONFIG_PATH=${HOME}/src/lib/pkgconfig 这时您可以使用命令查看所有已安装的库 pkg-config --list-all 依次 编译zlib: ./configure --prefix=$HOME/src;make;make install 编译libidn: ./configure --prefix=$HOME/src;make;make install 编译openssl (编译openssl的时候,使用命令./config 而不是./configure) ./config --prefix=$HOME/src;make;make install 编译libgpg-error ./configure --prefix=$HOME/src;make;make install 编译libgcrypto:(直接运行./configure的时候会出错,提示需要libgpg-error,使用./configure --help查看用法,找到--with-gpg-error-prefix选项,用于设置libgpg的安装路径) ./configure --prefix=$HOME/src --with-gpg-error-prefix=$HOME/src;make;make install 编译gnutls: ./configure --prefix=$HOME/src --with-libgcrypt-prefix=$HOME/src;make;make install 编译gloox稍微麻烦一点,需要修改几个文件 修改文件 :$HOME/src/gloox-0.9.9.5/src/tlsopenssl.cpp 第226行,”std::tolower”为“tolower” 修改文件 :$HOME/src/include/gnutls/gnutls.h 第290行,去掉 “GNUTLS_CRT_PRINT_UNSIGNED_FULL,“后的”,“ 修改文件:./configure 第20801行,“libgnutls-config --libs“改为” pkg-config --libs gnutls “ 运行(使用CXXFLAGS=-Wno-long-long选项,是为了编译long long 类型的变量不报错) ./configure CXXFLAGS=-Wno-long-long --prefix=$HOME/src --with-libidn=$HOME/src --with-gnutls=$HOME/src --with-openssl=$HOME/src 全部编译完成以后,就可以在 $HOME/src/lib中看到所有已经编译好的静态库(.a)和动态库(.dylib)文件,部分库编译的时候没有生成动态库,需要重新运行configure,添加--shared参数编译生成。 对于静态库,您可以直接使用 对于动态库,使用的时候需要注意几点: Mac OS的动态库连接路径使用的是绝对路径,您可以通过命令otool来查看其连接路径(如图2) otool -L libgloox.dylib 图2 使用otool 查看动态库连接路径 当您把这些库拷贝到另外一台机器上的时候,就会发生加载动态库出错。因为其他机器上在该绝对路径上并不能找到该动态库。 解决方法是使用install_name_tool命令来修改动态库连接路径 修改当前库连接路径 install_name_tool -id @executable_path/libgloox.dylib libgloox.dylib 修改依赖库连接路径(系统库的路径不用修改,如libiconv.2.dylib) install_name_tool -change /Users/ztj/src/lib/libidn.11.dylib @executable_path/libidn.11.dylib libgloox.dylib @executable_path表示执行程序文件的路径,也就是说您只需要把动态库拷贝到与执行程序文件相同的路径下即可正常运行。修改后的动态库连接路径如下(图3) 图3 修改动态库连接路径 四、使用gloox 在gloox源代码目录src/example中有很多的使用示例,可以直接运行查看其效果。 这部分目前正在研究中,详细的用法且听下回分解。