上周写一个游戏(http://blog.youkuaiyun.com/chenyufei1013/archive/2011/01/26/6165650.aspx)要用到Cairo图形库,于是就去下了个最新版本1.10.2(http://cairographics.org/releases/,文件名:cairo-1.10.2.tar.gz)。由于原先编过1.8.10版本(http://blog.youkuaiyun.com/chenyufei1013/archive/2010/08/07/5794910.aspx),所以心里还是有点底的。
Cairo依赖于三个库:pixman,zlib和libpng。这三个库我并未更新,所以参照1.8.10版本的编译即可。
我开始是在Mozilla-build工具中编译Cairo的,需要修改C:/mozilla-build/start-msvc9.bat文件,设置环境变量,可以参照下面的设置:
1: :: ============================================================================
2: :: Used to build cairo 1.10.2
3: :: ============================================================================
4: rem Root of cairo building
5: set "CAIROROOT=Q:/MineSweeper/Cairo"
6: rem Add zlib and libpng to LIB
7: set "LIB=%LIB%;%CAIROROOT%/output-1.10.2"
8: rem Add zlib and libpng to INCLUDE
9: set "INCLUDE=%INCLUDE%;%CAIROROOT%/zlib-1.2.5;%CAIROROOT%/libpng-1.5.0"
10: rem Add cairo, boilerplate, and pixman to INCLUDE
11: set "INCLUDE=%INCLUDE%;%CAIROROOT%/cairo-1.10.2/src"
12: set "INCLUDE=%INCLUDE%;%CAIROROOT%/cairo-1.10.2/boilerplate"
13: set "INCLUDE=%INCLUDE%;%CAIROROOT%/pixman-0.21.4/pixman"
14: :: ============================================================================
这里面主要是设置LIB和INCLUDE路径指向pixman、zlib、libpng、所在的目录。
编译Cairo的时,直接到src子目录下,执行如下命令,分别对应编译Cario动态库和Cairo静态库。
1: make -f Makefile.win32 static CFG=debug
2: make -f Makefile.win32 dynamic CFG=debug
编译Cario的时候需要一个cairo-features.h文件,参考如下建立这个文件放在src目录下即可。
1: #ifndef CAIRO_FEATURES_H
2: #define CAIRO_FEATURES_H
3:
4: #define CAIRO_HAS_FC_FONT 0
5: #define CAIRO_HAS_FT_FONT 0
6: #define CAIRO_HAS_IMAGE_SURFACE 1
7: #define CAIRO_HAS_PDF_SURFACE 1
8: #define CAIRO_HAS_PNG_FUNCTIONS 1
9: #define CAIRO_HAS_PS_SURFACE 1
10: #define CAIRO_HAS_RECORDING_SURFACE 1
11: #define CAIRO_HAS_SVG_SURFACE 1
12: #define CAIRO_HAS_USER_FONT 1
13: #define CAIRO_HAS_XLIB_SURFACE 0
14: #define CAIRO_HAS_XLIB_XRENDER_SURFACE 0
15: #define CAIRO_HAS_WIN32_SURFACE 1
16: #define CAIRO_HAS_WIN32_FONT 1
17:
18: #endif // CAIRO_FEATURES_H
有可能还会遇到其他错误,一种是某些函数链接不了,那么直接添加相关函数,只要保证含义正确即可。另一种是包VC的Runtime冲突什么的,也很简单,打开/src/Makefile.win32文件,在$(CFG)/cairo.dll: $(OBJECTS)一行的下面,加上/NODEFAULTLIB:"MSVCRT.lib",这里MSVCRT提示的冲突库的名称。
但是,虽然可以这么编。但是,编译出来的cairo.dll会依赖于多个VC动态库。所以,权衡了一下,打算从VC2008中编译,Cario源代码下默认是没有VC工程文件的,因此需要手动创建。
手动创建好VC2008工程后,编译那些源文件呢。我分析了一下makefile文件,再加上上面的编译结果,至少是可行的。首先,将上面的编译好的 obj文件对应的原文件添加到VC中,然后,配置头文件和lib文件所在的目录,第三是设置依赖那些库,这里要注意的是它还依赖于库 msimg32.lib,加进去就可以了。最后一步就是配置编译参数,简单的方法是在编译的Command Line中添加如下选项即可:
-nologo -MDd -Od -Zi -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
到这里,基本上就算编译成功了,只要Cairo以及所依赖的库都是自己通过VC编出来的,那么最后的Cario.dll就不会依赖于多个VC运行库。除非,你的依赖VC动态库的参数设置的不一样。