太阳神三国杀 在 64 位 Debian Linux: Squeeze (x86-64,amd6) 系统上编译成功了
发表于 : 2011-05-19 9:03
太阳神三国杀 在 64 位 Debian Linux: Squeeze (x86-64,amd6) 系统上编译成功了
详情可见 太阳神三国杀 论坛
贴子 《太阳神三国杀的的源代码的编译方法(仅限 Linux)》
中 68,70和 78 楼的 回复。
这里是整理后的精简版。
============
这里郑重声明,我早已经购买过桌面游戏三国杀的正版纸牌,所以该游戏只是帮我将该纸牌游戏电脑化。因此并不对三国杀桌面游戏构成侵权 (好像 mplayer 的 dvd 解码插件 不侵权一样)。所有对三国杀感兴趣的人,应支持购买三国杀正版纸牌游戏。
============
首先,十分感谢 太阳神上 的杰出工作。我仅仅是在 64 位系统下 编译安装,过程中遇到的困难已经十分头大。可以想见,太阳神上 阁下为了编程,牺牲了多少 宝贵的三国杀的 时间啊。
由于不满 三国杀网页版 的的慢,和盛大对火包的会员费。我下定决心开始编译 太阳神三国杀。不用 wine 运行其 windows 二进制包 的原因是字体老是搞不好。而且用 wine 运行的话,我必须出具 root 权限才能联网。(可能是我自己的问题。)
太阳神三国杀(以下简称 QSGS,Q 是 Qt) 是基于 Qt4 库的一款 开源 的 三国杀游戏。可联网,可单人,可加入任意个AI,AI的表现尚佳。对其详细说明可参见 百度百科的相应词条。 现在的最新版是 2011.05.08 (母亲节) 的 “春晖” 版。
由于 Qt4 库本身 和 太阳神三国杀(QSGS) 的源码都十分注意保证跨平台的兼容性,所以在windows 和 32位 的 ubuntu 上,太阳神三国杀(QSGS)的编译都已经成功了。
这里我报告一下 在 Debian Linux 64bit amd 双核笔记本 hp-Pavilion dv6 上编译安装 太阳神三国杀春晖版(QSGS) 所遇到的主要问题和解决方式。
太阳神三国杀(QSGS)是 C++ 编写的,以 swig 和 lua 进行脚步控制 ,使用 Qt4 图形库,IrrKlang 声音引擎库 ,并通过 库plib 提供游戏控制棒 支持的一款 三国杀游戏的电脑实现。
因此要完全编译安装 QSGS,电脑上必须安装有 c++ 编译器,swig, 库 Qt4 ,库 lua5.1, plib 和 IrrKlang 。 这其中除了 IrrKlang 外 都是开源的程序。在 Debian 和 Ubuntu 的标准源中都有各种架构的32位和64位安装包,直接 apt-get 或 新立德 即可。
而其中 库 IrrKlang 虽然有 可自由使用的 二进制安装包,但只有 32 位架构的。而且由于没有 源码, 所以不能重新编译为 64 位的。
所以除非有 32 位系统的兄弟 把 QSGS 整个静态编译后做成安装包,好像 windows 系统一样, 要在 64 为系统上 完全编译安装 QSGS 就必须装一大堆 32 位 的 库。不然 x86 架构下 32 位 的 IrrKlang库是无法和 64 位程序库, 如 64位 的 qt4 库,链接的。 为了 IrrKlang 这一个库。 不得不装一大堆(如Qt4)的32 位库。 这显然不是我要的。
由于我不是很需要 声音 ,显然将 QSGS 源代码中和 音效 相关的代码注释掉,就可以避免对 库IrrKlang 的依赖(我只要能联网打牌就可以了)。
=====================================
以下为尝试 编译安装 的详细过程。
QSGS源码包:Moligaloo-QSanguosha-Chunhui-16-ge29f0e2.tar.gz
======
我的系统情况:
$ uname -a
Linux RXlaptop 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64 GNU/Linux
===
安装 游戏棒Joystick 支持: libplib. 标准Debian和 Ubuntu 系统源 中就直接有 plib-1.8.5 的 deb 包。
# apt-get install libplib-dev libplib1
至此 libplib 安装成功。其中QSGS运行时的动态库在libplib1中,libplib-dev好像是不必要的,因为头文件已经包括在 QSGS 的源码包的 INCLUDE 目录下。
===
安装脚本支援包 swig 和 lua5.1:
# apt-get install swig
# apt-get inatall liblua5.1-dev
# ln -s /usr/lib/liblua5.1.so /usr/lib/liblua.so
# apt-get install liblua5.1-sql-sqlite3-dev
这里需要千万注意 swig 的版本号,一定要 > 2.0
$ swig -version
SWIG Version 2.0.4
Compiled with g++ [x86_64-unknown-linux-gnu] Configured options: +pcre
如果和我一样是 Debian Squeeze (stable) 或 Ubuntu 10.04 的话,很可能 swig 的版本号是1.3.4 , 即
$ swig -version
SWIG Version 1.3.4
如果 swig 版本号 < 2.0 。 编译安装和联网游戏都没有问题。 但 AI 不能正常运行,将只会 摸牌弃牌,不会 杀闪用锦囊和武将技。并且 QSGS 将在运行中报错:
“Error in output (arg 2), expected 'char const *' got 'nil'”
为了 在 Debian Squeeze (stable) 或 Ubuntu 10.04 上安装 swig2.0 ,可在 debian test(sid) 源 或 Ubuntu 源 下载 swig2.0_2.0.3-2_amd64.deb ,安装时提示需要依赖包 libpcre3 (>= 8.10), 于是又在 test(sid)源 的 pool/prce/ 目录下下载了 libpcre3_8.12-3_amd64.deb 。由于我的笔记本是 x86_64 的cpu, 内存 >4G ,所以安装的是 debian squeeze amd64系统, 因此下载的都是 _amd64.deb 二进制安装包。
安装 swig2.0 。
# dpkg --install swig2.0_2.0.3-2_amd64.deb libpcre3_8.12-3_amd64.deb
$ ls -l /usr/bin/swig
lrwxrwxrwx 1 root root 7 May 17 11:31 /usr/bin/swig -> swig2.0
========
至此,所有相关库的准备完成。可以开始编译 QSGS 源码了。
但如同我在后面所写,必须 编辑 QSGS ./src/目录下的cpp 源代码以解除 对32位 库IrrKlang 的依赖。 需要修改的源文件都在 ./src/ 文件夹中。 一共只有40行。
========
将 太阳神三国杀的 源码包:Moligaloo-QSanguosha-Chunhui-16-ge29f0e2.tar.gz 解压至目录 $QSGS/Chunhui-e29f0e2/
按 ./Chunhui-e29f0e2/compile.sh 中给出的顺序编译。
$ cd $QSGS/Chunhui-e29f0e2/swig
$ swig -c++ -lua sanguosha.i
$ cd ..
$ qmake QSanguosha.pro
以上顺利通过。得到 Makefile 。
===
对得到的该 Makefile 做两处修改。
(为了去除对 32位 库IrrKlang 的依赖):
1: 删去 "INCPATH =" 后 的选项 "-Iinclude/irrKlang";
2: 删去 "LIBS =" 后 的选项 "-lIrrKlang";
====
开始编译过程。
$ make
首先 make 出现的问题有可能是编译器无法找到头文件: stubs-32.h not found
google之, 发现要安装 64 位系统的 32 位兼容库(可能还要有ia32一类的库):
# apt-get install libc6-dev-i386
然后将得到的头文件 ln 到相应的目录即可。其后,该错误消除。
====
再接着 make 编译。会出现许多 error 信息, 都是关于找不到头文件 irrKlang.h 或是 没有定意函数 SoundEngine() 等等。 这些都是和 库IrrKlang 相关的代码。
找到所有错误信息中指出的源文件相应位置,注释掉相应语句后。最终得到没有效果音和相应对 库IrrKlang 依赖的源码。所有需要修改的源文件都在 ./src/ 文件夹中。我总共注释掉 40 行 源代码。 太阳神阁下的代码十分清爽。
我用"//--!!--//"注释每一行相应的 c++ 语句,最终做了以下修改。 ("grep -n "是为了显示行号。)
$ grep -n '//--!!--//' ./src/*.cpp
./src/button.cpp:2://--!!--// #include "irrKlang.h"
./src/button.cpp:9://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/button.cpp:46://--!!--//if(SoundEngine && !mute)
./src/button.cpp:47://--!!--// SoundEngine->play2D("audio/system/button-hover.ogg");
./src/button.cpp:55://--!!--// if(SoundEngine && !mute)
./src/button.cpp:56://--!!--// SoundEngine->play2D("audio/system/button-down.ogg");
./src/configdialog.cpp:4://--!!--// #include "irrKlang.h"
./src/configdialog.cpp:96://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/configdialog.cpp:108://--!!--// if(SoundEngine)
./src/configdialog.cpp:109://--!!--// SoundEngine->setSoundVolume(Config.Volume);
./src/engine.cpp:8://--!!--// #include "irrKlang.h"
./src/engine.cpp:12://--!!--// typedef irrklang::ISound SoundType;
./src/engine.cpp:42://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/engine.cpp:143://--!!--// if(SoundEngine)
./src/engine.cpp:144://--!!--// SoundEngine->drop();
./src/engine.cpp:537://--!!--// if(SoundEngine == NULL)
./src/engine.cpp:538://--!!--// return;
./src/engine.cpp:539://--!!--// if(SoundEngine->isCurrentlyPlaying(filename.toAscii()))
./src/engine.cpp:540://--!!--// return;
./src/engine.cpp:541://--!!--// SoundEngine->play2D(filename.toAscii());
./src/main.cpp:9://--!!--//#include "irrKlang.h"
./src/main.cpp:11://--!!--//irrklang::ISoundEngine *SoundEngine;
./src/main.cpp:30://--!!--// SoundEngine = irrklang::createIrrKlangDevice();
./src/main.cpp:31://--!!--// if(SoundEngine)
./src/main.cpp:32://--!!--// SoundEngine->setSoundVolume(Config.Volume);
./src/roomscene.cpp:9://--!!--// #include "irrKlang.h"
./src/roomscene.cpp:39://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/roomscene.cpp:2588://--!!--// static irrklang::ISound *BackgroundMusic;
./src/roomscene.cpp:2671://--!!--// if(!Config.EnableBgMusic || SoundEngine == NULL)
./src/roomscene.cpp:2672://--!!--// return;
./src/roomscene.cpp:2701://--!!--// BackgroundMusic = SoundEngine->play2D(filename, true, false, true);
./src/roomscene.cpp:2703://--!!--// if(BackgroundMusic)
./src/roomscene.cpp:2704://--!!--// BackgroundMusic->setVolume(Config.Volume);
./src/roomscene.cpp:2720://--!!--// if(BackgroundMusic)
./src/roomscene.cpp:2721://--!!--// BackgroundMusic->stop();
./src/startscene.cpp:55://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/startscene.cpp:58://--!!--// if(SoundEngine){
./src/startscene.cpp:59://--!!--// SoundEngine->drop();
./src/startscene.cpp:60://--!!--// SoundEngine = NULL;
./src/startscene.cpp:61://--!!--// }
一共只有 40 行, 比我估计的少多了。 在 c++ 语句中 句首的'//' ,注释了这些语句,使它们不再被编译,因此源代码就不再需要 库IrrKlang 了
===
继续 make 编译
$ make
出现的问题是:
./ui_connectiondialog.h:158: error: 'class QLineEdit' has no member named 'setPlaceholderText'
原因是 Qt4:4.6 的API 中没有 setPlaceholderText 。所以将源码中出现 setPlaceholderText 的行全部注释掉
(这些行仅 出现在 ui_connectiondialog.h 和 ui_configdialog.h 中),
其后该错误消除。
===
继续 make 编译
$ make
出现的问题是:
swig/sanguosha_wrap.cxx: In function ‘int _wrap_ServerPlayer_getRandomHandCard(lua_State*)’:
swig/sanguosha_wrap.cxx:7113: error: cast from ‘const Card*’ to ‘int’ loses precision
原因是 64 位系统下,指针地址 不再是一个 int 量
(int 是4个字节,就是 32 位,而 64 位系统中的地址是 64 位,8个字节),
(32 位的内存地址上限是 2^32= 4*2^(10*3)=4*(1k)^3=4G)
swig/sanguosha_wrap.cxx 的 第 7113 行代码是:
result = (int)((ServerPlayer const *)arg1)->getRandomHandCard();
google "linux 32位向64位的移植常见问题" 后得到处理方法:
修改用于存储传递指针的变量为intptr_t 类型定义,以保证平台兼容性。
即 将 第 7113 行代码中的强制类型转换 "(int)" 改变为 "(intptr_t)" 。
swig/sanguosha_wrap.cxx 的 第 7113 行代码变为:
result = (intptr_t)((ServerPlayer const *)arg1)->getRandomHandCard();
===
继续 make 编译
$ make
最终无 error 编译通过。得到 ./Chunhui-e29f0e2/QSanguosha
可以看到 这是一个 64 位程序。
$ objdump -a ./QSanguosha ; file ./QSanguosha
./QSanguosha: file format elf64-x86-64
./QSanguosha: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
可以用
$ make clean
消除编译过程中间生成的目标 .o 文件。
=======
运行./QSanguosha 可建立了 QSGS 服务器,并通过 WIFI 的无限网猫 和实验室内部的机器联网,在 局域网址 192.168.1.39 内,三国杀对战。服务器和每台联网机器上都可以开多个客户端。单机,聊天,联网,都没有问题。 电脑 AI 会使用锦囊和杀,酒杀进攻。
局域网内的机器,有winxp 和 vista 的,以我的Linux 笔记本作服务器,或以windows 作服务器都 完全没问题。而且,他们(windows 下之间安全的春晖版)都有声音(显然的不是吗)。
在我成功 64位 linux 编译 成功的鼓励下,本实验室的 Ipad 妹妹也准备在她个人的 64 位 苹果 上编译 QSGS 了。
游戏的过程中还可以录像。录像文件的后缀名就是普通的 txt,本身它就是简单的纯文本文件。
对于要把录相加快 10倍 很简单。将录像文件 replay.txt 每行行首的数字都减去其最低的个位,相当于缩小10倍即可。 linux 下一句话解决问题,得到速度加快10倍的 replay_fast10times.txt
$ sed -e '/^[0-9]\{4,\}/s/^\([0-9]*\)[0-9] /\1 /' replay.txt > replay_fast_10times.txt
(注意:单引号内的空格必须原样保留)
要加快100倍也很简单,削去最低的个位和十位即可:
$ sed -e '/^[0-9]\{4,\}/s/^\([0-9]*\)[0-9][0-9] /\1 /' replay.txt > replay_fast_100times.txt
详情可见 太阳神三国杀 论坛
贴子 《太阳神三国杀的的源代码的编译方法(仅限 Linux)》
中 68,70和 78 楼的 回复。
这里是整理后的精简版。
============
这里郑重声明,我早已经购买过桌面游戏三国杀的正版纸牌,所以该游戏只是帮我将该纸牌游戏电脑化。因此并不对三国杀桌面游戏构成侵权 (好像 mplayer 的 dvd 解码插件 不侵权一样)。所有对三国杀感兴趣的人,应支持购买三国杀正版纸牌游戏。
============
首先,十分感谢 太阳神上 的杰出工作。我仅仅是在 64 位系统下 编译安装,过程中遇到的困难已经十分头大。可以想见,太阳神上 阁下为了编程,牺牲了多少 宝贵的三国杀的 时间啊。
由于不满 三国杀网页版 的的慢,和盛大对火包的会员费。我下定决心开始编译 太阳神三国杀。不用 wine 运行其 windows 二进制包 的原因是字体老是搞不好。而且用 wine 运行的话,我必须出具 root 权限才能联网。(可能是我自己的问题。)
太阳神三国杀(以下简称 QSGS,Q 是 Qt) 是基于 Qt4 库的一款 开源 的 三国杀游戏。可联网,可单人,可加入任意个AI,AI的表现尚佳。对其详细说明可参见 百度百科的相应词条。 现在的最新版是 2011.05.08 (母亲节) 的 “春晖” 版。
由于 Qt4 库本身 和 太阳神三国杀(QSGS) 的源码都十分注意保证跨平台的兼容性,所以在windows 和 32位 的 ubuntu 上,太阳神三国杀(QSGS)的编译都已经成功了。
这里我报告一下 在 Debian Linux 64bit amd 双核笔记本 hp-Pavilion dv6 上编译安装 太阳神三国杀春晖版(QSGS) 所遇到的主要问题和解决方式。
太阳神三国杀(QSGS)是 C++ 编写的,以 swig 和 lua 进行脚步控制 ,使用 Qt4 图形库,IrrKlang 声音引擎库 ,并通过 库plib 提供游戏控制棒 支持的一款 三国杀游戏的电脑实现。
因此要完全编译安装 QSGS,电脑上必须安装有 c++ 编译器,swig, 库 Qt4 ,库 lua5.1, plib 和 IrrKlang 。 这其中除了 IrrKlang 外 都是开源的程序。在 Debian 和 Ubuntu 的标准源中都有各种架构的32位和64位安装包,直接 apt-get 或 新立德 即可。
而其中 库 IrrKlang 虽然有 可自由使用的 二进制安装包,但只有 32 位架构的。而且由于没有 源码, 所以不能重新编译为 64 位的。
所以除非有 32 位系统的兄弟 把 QSGS 整个静态编译后做成安装包,好像 windows 系统一样, 要在 64 为系统上 完全编译安装 QSGS 就必须装一大堆 32 位 的 库。不然 x86 架构下 32 位 的 IrrKlang库是无法和 64 位程序库, 如 64位 的 qt4 库,链接的。 为了 IrrKlang 这一个库。 不得不装一大堆(如Qt4)的32 位库。 这显然不是我要的。
由于我不是很需要 声音 ,显然将 QSGS 源代码中和 音效 相关的代码注释掉,就可以避免对 库IrrKlang 的依赖(我只要能联网打牌就可以了)。
=====================================
以下为尝试 编译安装 的详细过程。
QSGS源码包:Moligaloo-QSanguosha-Chunhui-16-ge29f0e2.tar.gz
======
我的系统情况:
$ uname -a
Linux RXlaptop 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64 GNU/Linux
===
安装 游戏棒Joystick 支持: libplib. 标准Debian和 Ubuntu 系统源 中就直接有 plib-1.8.5 的 deb 包。
# apt-get install libplib-dev libplib1
至此 libplib 安装成功。其中QSGS运行时的动态库在libplib1中,libplib-dev好像是不必要的,因为头文件已经包括在 QSGS 的源码包的 INCLUDE 目录下。
===
安装脚本支援包 swig 和 lua5.1:
# apt-get install swig
# apt-get inatall liblua5.1-dev
# ln -s /usr/lib/liblua5.1.so /usr/lib/liblua.so
# apt-get install liblua5.1-sql-sqlite3-dev
这里需要千万注意 swig 的版本号,一定要 > 2.0
$ swig -version
SWIG Version 2.0.4
Compiled with g++ [x86_64-unknown-linux-gnu] Configured options: +pcre
如果和我一样是 Debian Squeeze (stable) 或 Ubuntu 10.04 的话,很可能 swig 的版本号是1.3.4 , 即
$ swig -version
SWIG Version 1.3.4
如果 swig 版本号 < 2.0 。 编译安装和联网游戏都没有问题。 但 AI 不能正常运行,将只会 摸牌弃牌,不会 杀闪用锦囊和武将技。并且 QSGS 将在运行中报错:
“Error in output (arg 2), expected 'char const *' got 'nil'”
为了 在 Debian Squeeze (stable) 或 Ubuntu 10.04 上安装 swig2.0 ,可在 debian test(sid) 源 或 Ubuntu 源 下载 swig2.0_2.0.3-2_amd64.deb ,安装时提示需要依赖包 libpcre3 (>= 8.10), 于是又在 test(sid)源 的 pool/prce/ 目录下下载了 libpcre3_8.12-3_amd64.deb 。由于我的笔记本是 x86_64 的cpu, 内存 >4G ,所以安装的是 debian squeeze amd64系统, 因此下载的都是 _amd64.deb 二进制安装包。
安装 swig2.0 。
# dpkg --install swig2.0_2.0.3-2_amd64.deb libpcre3_8.12-3_amd64.deb
$ ls -l /usr/bin/swig
lrwxrwxrwx 1 root root 7 May 17 11:31 /usr/bin/swig -> swig2.0
========
至此,所有相关库的准备完成。可以开始编译 QSGS 源码了。
但如同我在后面所写,必须 编辑 QSGS ./src/目录下的cpp 源代码以解除 对32位 库IrrKlang 的依赖。 需要修改的源文件都在 ./src/ 文件夹中。 一共只有40行。
========
将 太阳神三国杀的 源码包:Moligaloo-QSanguosha-Chunhui-16-ge29f0e2.tar.gz 解压至目录 $QSGS/Chunhui-e29f0e2/
按 ./Chunhui-e29f0e2/compile.sh 中给出的顺序编译。
$ cd $QSGS/Chunhui-e29f0e2/swig
$ swig -c++ -lua sanguosha.i
$ cd ..
$ qmake QSanguosha.pro
以上顺利通过。得到 Makefile 。
===
对得到的该 Makefile 做两处修改。
(为了去除对 32位 库IrrKlang 的依赖):
1: 删去 "INCPATH =" 后 的选项 "-Iinclude/irrKlang";
2: 删去 "LIBS =" 后 的选项 "-lIrrKlang";
====
开始编译过程。
$ make
首先 make 出现的问题有可能是编译器无法找到头文件: stubs-32.h not found
google之, 发现要安装 64 位系统的 32 位兼容库(可能还要有ia32一类的库):
# apt-get install libc6-dev-i386
然后将得到的头文件 ln 到相应的目录即可。其后,该错误消除。
====
再接着 make 编译。会出现许多 error 信息, 都是关于找不到头文件 irrKlang.h 或是 没有定意函数 SoundEngine() 等等。 这些都是和 库IrrKlang 相关的代码。
找到所有错误信息中指出的源文件相应位置,注释掉相应语句后。最终得到没有效果音和相应对 库IrrKlang 依赖的源码。所有需要修改的源文件都在 ./src/ 文件夹中。我总共注释掉 40 行 源代码。 太阳神阁下的代码十分清爽。
我用"//--!!--//"注释每一行相应的 c++ 语句,最终做了以下修改。 ("grep -n "是为了显示行号。)
$ grep -n '//--!!--//' ./src/*.cpp
./src/button.cpp:2://--!!--// #include "irrKlang.h"
./src/button.cpp:9://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/button.cpp:46://--!!--//if(SoundEngine && !mute)
./src/button.cpp:47://--!!--// SoundEngine->play2D("audio/system/button-hover.ogg");
./src/button.cpp:55://--!!--// if(SoundEngine && !mute)
./src/button.cpp:56://--!!--// SoundEngine->play2D("audio/system/button-down.ogg");
./src/configdialog.cpp:4://--!!--// #include "irrKlang.h"
./src/configdialog.cpp:96://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/configdialog.cpp:108://--!!--// if(SoundEngine)
./src/configdialog.cpp:109://--!!--// SoundEngine->setSoundVolume(Config.Volume);
./src/engine.cpp:8://--!!--// #include "irrKlang.h"
./src/engine.cpp:12://--!!--// typedef irrklang::ISound SoundType;
./src/engine.cpp:42://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/engine.cpp:143://--!!--// if(SoundEngine)
./src/engine.cpp:144://--!!--// SoundEngine->drop();
./src/engine.cpp:537://--!!--// if(SoundEngine == NULL)
./src/engine.cpp:538://--!!--// return;
./src/engine.cpp:539://--!!--// if(SoundEngine->isCurrentlyPlaying(filename.toAscii()))
./src/engine.cpp:540://--!!--// return;
./src/engine.cpp:541://--!!--// SoundEngine->play2D(filename.toAscii());
./src/main.cpp:9://--!!--//#include "irrKlang.h"
./src/main.cpp:11://--!!--//irrklang::ISoundEngine *SoundEngine;
./src/main.cpp:30://--!!--// SoundEngine = irrklang::createIrrKlangDevice();
./src/main.cpp:31://--!!--// if(SoundEngine)
./src/main.cpp:32://--!!--// SoundEngine->setSoundVolume(Config.Volume);
./src/roomscene.cpp:9://--!!--// #include "irrKlang.h"
./src/roomscene.cpp:39://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/roomscene.cpp:2588://--!!--// static irrklang::ISound *BackgroundMusic;
./src/roomscene.cpp:2671://--!!--// if(!Config.EnableBgMusic || SoundEngine == NULL)
./src/roomscene.cpp:2672://--!!--// return;
./src/roomscene.cpp:2701://--!!--// BackgroundMusic = SoundEngine->play2D(filename, true, false, true);
./src/roomscene.cpp:2703://--!!--// if(BackgroundMusic)
./src/roomscene.cpp:2704://--!!--// BackgroundMusic->setVolume(Config.Volume);
./src/roomscene.cpp:2720://--!!--// if(BackgroundMusic)
./src/roomscene.cpp:2721://--!!--// BackgroundMusic->stop();
./src/startscene.cpp:55://--!!--// extern irrklang::ISoundEngine *SoundEngine;
./src/startscene.cpp:58://--!!--// if(SoundEngine){
./src/startscene.cpp:59://--!!--// SoundEngine->drop();
./src/startscene.cpp:60://--!!--// SoundEngine = NULL;
./src/startscene.cpp:61://--!!--// }
一共只有 40 行, 比我估计的少多了。 在 c++ 语句中 句首的'//' ,注释了这些语句,使它们不再被编译,因此源代码就不再需要 库IrrKlang 了
===
继续 make 编译
$ make
出现的问题是:
./ui_connectiondialog.h:158: error: 'class QLineEdit' has no member named 'setPlaceholderText'
原因是 Qt4:4.6 的API 中没有 setPlaceholderText 。所以将源码中出现 setPlaceholderText 的行全部注释掉
(这些行仅 出现在 ui_connectiondialog.h 和 ui_configdialog.h 中),
其后该错误消除。
===
继续 make 编译
$ make
出现的问题是:
swig/sanguosha_wrap.cxx: In function ‘int _wrap_ServerPlayer_getRandomHandCard(lua_State*)’:
swig/sanguosha_wrap.cxx:7113: error: cast from ‘const Card*’ to ‘int’ loses precision
原因是 64 位系统下,指针地址 不再是一个 int 量
(int 是4个字节,就是 32 位,而 64 位系统中的地址是 64 位,8个字节),
(32 位的内存地址上限是 2^32= 4*2^(10*3)=4*(1k)^3=4G)
swig/sanguosha_wrap.cxx 的 第 7113 行代码是:
result = (int)((ServerPlayer const *)arg1)->getRandomHandCard();
google "linux 32位向64位的移植常见问题" 后得到处理方法:
修改用于存储传递指针的变量为intptr_t 类型定义,以保证平台兼容性。
即 将 第 7113 行代码中的强制类型转换 "(int)" 改变为 "(intptr_t)" 。
swig/sanguosha_wrap.cxx 的 第 7113 行代码变为:
result = (intptr_t)((ServerPlayer const *)arg1)->getRandomHandCard();
===
继续 make 编译
$ make
最终无 error 编译通过。得到 ./Chunhui-e29f0e2/QSanguosha
可以看到 这是一个 64 位程序。
$ objdump -a ./QSanguosha ; file ./QSanguosha
./QSanguosha: file format elf64-x86-64
./QSanguosha: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
可以用
$ make clean
消除编译过程中间生成的目标 .o 文件。
=======
运行./QSanguosha 可建立了 QSGS 服务器,并通过 WIFI 的无限网猫 和实验室内部的机器联网,在 局域网址 192.168.1.39 内,三国杀对战。服务器和每台联网机器上都可以开多个客户端。单机,聊天,联网,都没有问题。 电脑 AI 会使用锦囊和杀,酒杀进攻。
局域网内的机器,有winxp 和 vista 的,以我的Linux 笔记本作服务器,或以windows 作服务器都 完全没问题。而且,他们(windows 下之间安全的春晖版)都有声音(显然的不是吗)。
在我成功 64位 linux 编译 成功的鼓励下,本实验室的 Ipad 妹妹也准备在她个人的 64 位 苹果 上编译 QSGS 了。
游戏的过程中还可以录像。录像文件的后缀名就是普通的 txt,本身它就是简单的纯文本文件。
对于要把录相加快 10倍 很简单。将录像文件 replay.txt 每行行首的数字都减去其最低的个位,相当于缩小10倍即可。 linux 下一句话解决问题,得到速度加快10倍的 replay_fast10times.txt
$ sed -e '/^[0-9]\{4,\}/s/^\([0-9]*\)[0-9] /\1 /' replay.txt > replay_fast_10times.txt
(注意:单引号内的空格必须原样保留)
要加快100倍也很简单,削去最低的个位和十位即可:
$ sed -e '/^[0-9]\{4,\}/s/^\([0-9]*\)[0-9][0-9] /\1 /' replay.txt > replay_fast_100times.txt