发新话题
打印

win32下 VC8,9 + wesnoth1.6.5 Stable 开贴分享经验

win32下 VC8,9 + wesnoth1.6.5 Stable 开贴分享经验

经过两天的努力,克服了很多困难,终于编译成功了
而且 vc8,9 ,release和debug 均运行正常
Windows下编译wesnoth 的资料非常少,而且之前的旧贴,我个人认为也存在一些问题
未来几天中,我会贴出这次编译的心得,让大家少走弯路,共同学习进步
本帖最近评分记录

TOP

. 准备依赖库

请下载如下依赖库的Develop filelib)和BinaryDll),部分需要下载源文件(source
我写出我下载的版本号以供参考
1. SDL 系列
–>
www.libsdl.org

SDL-devel-1.2.14-VC8 (请同时下载源文件,此库需要重新编译)
SDL_ttf-devel-2.0.9-VC8
SDL_net-devel-1.2.7-VC8
SDL_mixer-devel-1.2.11-VC
SDL_image-devel-1.2.10-VC
后面4个没有链接,直接在他网站上搜索

2.
GTK for Win -> www.gtk.org/download-windows.html

GLib 2.22.3
Pango 1.26.1
cairo 1.8.8

3. 字符国际化支持库
libintl-0.14.4-lib
libiconv-1.9.2-1-bin.zip

4. boost
库。boost_1_40_0

只有源代码可下,需要自己编译,但是只编译其中23)个库即可

5. 一个压缩库,配合boost使用
zlib 1.2.3 -> www.zlib.net

6.两个头文件
inttypes.h stdint.h,这两个文件来自标准c 99VC2005不完全支持c99标准,所以要重新下载,然后放入wesnoth的源文件目录。

7. POSIX thread -> http://sourceware.org/pthreads-win32/

二,编译依赖库

之所以要重新编译一些库,是因为本工程依赖库较多,出现了Windows
CRTLib(C运行库)混用的问题,会引起错误2005,如下LIBCMTD.lib(xxx.obj) : error LNK2005: __xxx already defined in MSVCRTD.lib(MSVCRTD.dll)

共有六种运行库
Single Threaded   /MLLIBC    (none)
Static MultiThread   /MT   LIBCMT   _MT  
Dynamic Link (DLL)   /MD   MSVCRT   _MT and _DLL
Debug Single Threaded   /MLd   LIBCD _DEBUG
Debug Static MultiThread  /MTd   LIBCMTD   _DEBUG and _MT
Debug Dynamic Link (DLL)   /MDd   MSVCRTD   _DEBUG, _MT, and _DLL

你可以在Property -> C/C++ -> Code Generation -> Runtime Library 进行更改
一般来讲,Debug使用MTdRelease MD
总之,所有Lib必须统一CRT,全用MT或者全用MD
具体知识请自行查阅,不予赘述

1.重新编译SDL SDL-devel-1.2.14-VC8
找到源文件下的VC工程,里面有两个工程,选择SDLMain,更改Release模式下CRTMTd重新发布
具体为Property -> C/C++ -> Code Generation -> Runtime Library
用新生成的Lib替代刚下载的SDLMain.lib

2. Boost
Boost编译比较复杂,网上有很多资料可以参考
简单来说就是
首先,我们使用bjam来编译,boost库中带有bjam的源文件,但是建议去下载一个编译好的bjam.exe,将其放在boost的根目录。
之后打开命令行cmd,转到boost目录下运行bjam。共需要编译两个库(编译后实际得到3个),各自又分DebugRelease模式,所以最后生成共计6Lib

编译参数如下:

Debug
运行bjam --toolset=msvc-8.0 --with-regex stage runtime-link=static threading=multi debug
生成libboost_regex-vc80-mt-sgd-1_38.libregex(正则表达式)
运行bjam --toolset=msvc-8.0 --with-iostreams -sZLIB_SOURCE=i:\zlib123 stage runtime-link=static threading=multi debug
(注意:sZLIB_SOURCE=i:\zlib123是你zlib的位置)
生成libboost_iostreams-vc80-mt-sgd-1_38.liblibboost_zlib-vc80-mt-sgd-1_38.libiostreamszlib


Release
更改最后为参数为Release即可,如
bjam --toolset=msvc-8.0 --with-regex stage runtime-link=static threading=multi release
bjam --toolset=msvc-8.0 --with-iostreams -sZLIB_SOURCE=i:\zlib123 stage runtime-link=static threading=multi release

你会在booset/stage目录下找到编译好的库


VC
工程设置


1建立一个新工程Win32 Project,空工程即可

2 wensnoth的源文件导入工程,包括文件夹guiserializationeditor2 widgets,建议将头文件和源文件分开,好习惯。注意,有三个文件不要导入loadscreen_empty.cppmalloc.cpoolalloc.c

3 将依赖库的头文件和Lib文件的目录依次添加,比较多,耐心
Tools->option->roject and Solution ->VC++ Directories
注意,
头文件目录里请添加wesnoth的目录
\wesnoth-1.6.5\wesnoth-1.6.5\src

Glib库需要添加两个头文件目录glib-dev_2.22.3-1_win32\include\glib-2.0
I:\wesnoth\glib-dev_2.22.3-1_win32\lib\glib-2.0\include

别忘添加 Boost的目录
头文件目录共计14个,如果没数错的话
Lib文件目录,在包括刚编译好Boostlib情况下, 共计12

4. Setting (感谢ancientcc前辈的努力)
General -> Project Defaults-> Character Set: Use Multi-Byte Character Set
C/C++ -> General -> Detect 64-bit Portability Issues:  Nodefault Yes (/Wp64)
Preprocessor -> Preprocessor Definitions:
WIN32;NDEBUG;_WINDOWS;NOMINMAX;_CRT_SECURE_NO_DEPRECATE(增加NOMINMAX宏,_CRT_SECURE_NO_DEPRECATE宏)


Language –> Enable Run-Time Type Info Yes(/GR)default No


Linker -> Input ->
Additional Dependencies: SDL.lib SDLmain.lib SDL_image.lib SDL_ttf.lib SDL_mixer.lib libintl.lib SDL_net.lib Ws2_32.lib pango-1.0.lib pangocairo-1.0.lib pangoft2-1.0.lib pangowin32-1.0.lib cairo.lib glib-2.0.lib gobject-2.0.lib (
视情况添加 lua5.1.lib)


Ignore Specific Library:填成空。(不要忽略msvcrt.lib!!!我们已经解决了CRT混用的情况)

代码修改和遗留问题

我们的目标版本是wesnoth-1.6.5 Stable
源代码主要有三个地方需要修改

1.有两到三处 "Female 鈾
这样的符号无法识别,大概是Uniciode的问题,自己在后面加一个引号,否则后面的代码无法编译(这个符号实际要表达男女性别标识符)

2. font.CPP Line 40
#ifdef CAIRO_HAS_FT_FONT
#include <fontconfig/fontconfig.h>
#endif
这个宏其实是被定义了的(在<cairo-features.h>中),但是这个头文件是Linux下文件,而且后面某处还会调用这个头文件中的方法,都是linux下的。
所以我选择在前面加了一句#undef CAIRO_HAS_FT_FONT
但是似乎引起了游戏中无法更换语言的问题,具体还在研究中

3. Game.CPP 2200
#ifndef DISABLE_POOL_ALLOC
extern "C" {
void init_custom_malloc();

}

#endif
这个函数是被定义在malloc.c中,而且会在接下来的几行中被调用。但是如果malloc.c加入工程中的话会引起一些错误,不加入的话,显然不会被编译,从而引起Linking错误。至今无法解决,希望大家能解决并告诉我。
我的解决方案是屏蔽它

结束

现在大家可以尝试编译了!
有问题联系我
email:
kkwoodf@gmail.com
msn: kkwood1984@hotmail.com
感谢前辈ancientcc

[ 本帖最后由 kkwood 于 2010-1-9 04:28 编辑 ]

TOP

呵呵,不错。有了这技术,我们可以搞“中国版”了。
¡Hasta la victoria siempre!

TOP

楼主: 1.8.3 开始可以支持 vc9 编译,我看官方文档说已经把所有额外需要的库都提供成一个包了,不妨试试,这个估计搞起来要简单些。

TOP

发新话题