Skip to content
xiehuc edited this page Jul 16, 2015 · 15 revisions

Build

Build On Linux

instruction

安装下列软件包(注意你的发行版可能使用与此不同的包名)

依赖的包有:

gcc g++ make cmake pkg-config curl(开发包) libpurple(开发包) sqlite3(开发包) zlib(开发包)

可选包(现在不安装基本上用不了了):

js(开发包) libev(开发包)

在linux上编译非常简单,在linux上可以任意的选择libev和libuv作为异步库,因为libuv一 般还没有进入源中,需要自己编译.所以一般使用libev.

例如,在 Ubuntu/Debian 上,可以用以下命令安装依赖的库:

$ sudo apt-get install build-essential cmake pkg-config libcurl4-openssl-dev
libsqlite3-dev libmozjs185-dev libev-dev

在Fedora上,可以使用以下命令安装:

$ sudo yum install gcc gcc-c++ make cmake pkgconfig libcurl-devel
sqlite-devel zlib-devel js-devel

注意推荐使用 curl>=7.22.0,否则图片收发可能有问题。

build

可以下载zip包或者使用git clone 命令:

$ mkdir build;cd build;
$ cmake ..
$ make
$ sudo make install

Note

需要注意,可以使用 cmake .. -DCMAKE_INSTALL_PREFIX=/usr 来指定安装到/usr 目录下.或者在 ~/.xprofile 文件中加入 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH 才能在桌面(如pidgin)中加载 liblwqq.so成功

option

编译成功以后会出现如下的提示:需要特别注意:

================lwqq flags=====================
-- With Libev (Option)     : ON
-- With Mozjs (Option)     : ON
-- Build Document (Option) : OFF
===============================================

表示开启了Libev和Mozjs两个编译选项,另外不会编译文档.选项都是自动检测开启的,即如 果你的系统中安装了相应的package,则自动打开,否则关闭.详细的选项说明如下:

  • With Libev : 可以减少UI的卡顿问题,会自动检测是否安装了libev-dev包来自动 启用。 因为一些系统如ubuntu的libcurl的dns查询是同步方式的,所以在网络环境差的 时候容易 卡UI.libev能够有效的解决这种问题.但是鉴于平时测定单纯用libpurple的 eventloop的效能也不算太差,所以libev使 用可选方式支持.
  • With Mozjs : 提供javascript解析hash.js的能力,能够快速应对webqq更新js的 情况而无需重新编译。(不过最近webqq更新js的频率变低了),支持mozjs185和 mozjs17两种,默认以mozjs17优先. 更新: 在0.3.1版本中, 默认会使用自动检测hash 的功能, 因此99%的情况下不必再编译mozjs. 详细的说就是, 会在几个自带hash函数中 进行尝试, 知道尝试出正确的那个. 但是如果是腾讯出了一个新的hash算法, 则还是会 提示hash错误.

Note

令人意外的是,Libev不是必选的依赖,如果在没有开启Libev的情况下编译也能通过,此时如果使用异步的API,会提示:

Assertion failed: (LWQQ__ASYNC_IMPL(loop_create)), function lwqq_async_init,
file   /Users/xiehuc/PROJECT/lwqq/lib/async.c, line 94.

意思是没有提供异步实现的接口。要么重新打开Libev,要么在代码中提供一个新的实现。

可以使用 cmake .. -DWITH_{...} 来强制打开关闭选项.例如当你编译之后才安装的 依赖包,由于自动检测已经关闭选项了.所以使用:

cmake ..  -DWITH_LIBEV=On -DWITH_MOZJS=On

来重新打开,最后的是否成功打开可以参考提示信息.

For CentOS Users

由于Centos上面的很多包都太老了,导致没有mozjs185,这里需要说明的是,这里需要说明的 是,我只能尽量去向后兼容,对于做到对centos现有的兼容程度已经付出了很多的劳动,而且 始终没有办法避免包太老的问题,我已经决定不再 回复centos编译问题提出的任何 issue ,请自行解决,现在还有很多人没有明白mozjs185是怎么回事:

  1. mozjs185包是 可选 的, 在0.3.1版本以后能够自动选择hash, 更加降低了mozjs 的必要性.
  2. 开启了mozjs185包的好处是以后在webqq更换了hash校验之后能很快重新登录,并且是 对用户透明的.因为这里需要别人先发issue说hash函数更新了,我去从官网的js中把 hash相关的趴下来,放到sae中,然后其它用户在下次登录的时候会自动从sae下载 hash.js从而顺利验证.
  3. 不开启mozjs185不影响平时的使用,但是在webqq更换了hash校验之后就会提示错误,并 且只有等到我把js翻译成c语言,然后放到github上,再由自己重新编译源代码或者是等 待别人打包好的二进制包.所以周期比较长
  4. 把js翻译成c的工作我以后会越来越少做,因为我相当于是义务性质的工作,想翻译或者 是不想翻译是我的事,因为我已经提供了更好的解决方案,至于自己因为包太老的原因 我只能表示我已经尽力的,翻译js的工作是重复的,多余的.如果是你觉得我十分的懒惰 ,或者是性格恶劣或者是不够意思,我想说"这里是开放的平台",请不要把压力都集中在 某一个人上面,因为 完全可以提交patch ,这个项目开了这么久了 也没见多少 人pull request ,这个开源的气氛完全没有.

其实我还有很多想说的,但是我说了结果肯定会引起不愉快的,所以我还是先闭口吧.

我随便找了一个centos可用的mozjs,可以用下面的方法安装:

#yum localinstall
http://packages.squiz.net/centos/5/x86_64/mozjs17-devel-17.0.0-4.el5.centos-squiz.x86_64.rpm
http://packages.squiz.net/centos/5/x86_64/mozjs17-17.0.0-4.el5.centos-squiz.x86_64.rpm

其它的步骤就和上面的一样了.

另外,可能centos上需要 make两次 才能编译,这个可能是cmake2.6的问题,cmake2.6实 在是太老了,我在其它系统上面也没有遇到问题,所以就没有去排查了.应该不是我配置写得 不好的原因.

Build On Mac OSX

在Mac平台的编译方法有两种, 一种是类似 Linux 方式的 cmake;make;make install 流. 这个比较简单, 直接使用 brew 安装缺失的包就行了. 另外执行install的时候不必加上 sudo,直接使用 make install 即可。

另外一种是使用 Xcode 来编译出 framework. framework 比第一种方式好的在于可以放在 .app 或者 bundle 中. 移动性能好一些.

  1. 首先还是使用 brew 安装缺失的依赖. 注意 mozjs185 在 brew 中叫做 spidermonkey.
  2. 然后将 nspr 的3个 .a 文件(libnspr4.a, libplc4.a, libplds4.a)放在源代码的 xcode 目录中, 方便静态链接.
  3. mkdir build; cmake .. -DWITH_LIBEV=Off -DWITH_LIBUV=Off 来生成 config.h 文 件.由于我们编译 framework 是为了接下来给 adium 用的, 所以这里不需要 libev, 直接使用 glib 的异步
  1. 打开 xcode/lwqq.xcodeproj 编译即可.

Build On Windows

instruction

  • 支持程序:安装windows版本的 cmakemingw32 , 并且设置好环境变量.注意,在Cygwin中的mingw32和直接安装的mingw32是不一样的环境 。为了避免不必要的麻烦,推荐在后者的环境中编译。另外msys并不会直接找到mingw, 需要先在Windows的环境变量中加入X:/mingw/bin即可。
  • 异步的支持:Windows平台上不支持libev(自己编译出来的没有backends),所以可以使用替代的libuv或者是完全禁用异 步。如果是要在其它程序中引用liblwqq库,还可以通过async_impl.h使用其它的异步库 。详见API。

prepare

使用一个文件夹作为编译的根目录,作为 lwqq_root ,并且,从github上下载lwqq的源代码 .放在 lwqq_root/lwqq 下面

建立 lwqq_root/win32-dev 文件夹作为存放依赖的目录。

  • 下载 libcurl ,并且解压之后放在 win32-dev/libcurl 目录下面.并且将其中的 lib/libcurldll.a 更改为 lib/libcurl.dll.a 为了使得cmake能够顺利的找到 预编译的dll符号链接.
  • 下载 sqlite3 dllsqlite3 header 分别下 并且解压之后放在 win32-dev/sqlite3 目录下面
  • 下载 zlib dllzlib header 并且解压之后放在`win32-dev/zlib`目录下面

fool package

为了方便大家,也可以直接下载整理好的依赖-- 傻瓜包 ,并且直接解压到 win32-dev文件夹

build

打开一个Mingw Shell(也被称作MSYS),然后打开 lwqq_root/lwqq 目录,输入:

mkdir build;
cd build;
cmake .. -G "MSYS Makefiles" -DWIN32_LIBS_DIR=`lwqq_root/win32-dev` -DRES_DIR="share\\lwqq"
make

RES_DIR 设置为相对路径是为了在pidgin-lwqq中正确找到资源文件。 然后就可以在 build/lib 目录下找到liblwqq.dll,以及在 build/src 目录下面找到lwqq-cli.exe了.

注意:因为cmake使用cache的方式记忆设置,所以容易出现混乱,可以删除CmakeCache.txt之后重头编译.

build with libuv

build libuv

首先下载libuv的源码包,解压到lwqq_root/win32-dev/libuv下面,然后先用git clone gyp 准备好gyp,安装好python2.7 libuv目前只能在visual studio下编译.mingw编译会出现错误。所以我们执行

$ vcbuild.bat release x86 shared

编译libuv,测试只能编译动态链接库,编译静态链接库的话mingw会无法链接。如果出现编译错误。不用管。因为是在run-test子项目出错的。我们只需要libuv。

在上一步的cmake中直接输入:会自动检测libuv是否存在并启用。
cmake .. -G "MSYS Makefiles" -DWIN32_LIBS_DIR=`lwqq_root/win32-dev`

也可以使用-DWITH_LIBUV=On强制打开

Bob Xiang 提供了一个编译好的二进制包( issue #22 ).见: http://pan.baidu.com/s/1hq01wEC

run

将各个依赖库中的dll文件复制到 build/src 目录下面,把 build/lib 目录下的 liblwqq.dll复制到 build/src ,输入 lwqq-cli -u[qqnum] -p[passwd] 运行简 单的登录程序测试是否正常工作.