最近,想做一下多绘图引擎的支持,所以需要研究一下时下流行的绘图引擎,为了在C#中使用Cairo,所以用git下来编译一下。
首先建立跟目录 Cairo,当然,你可以随便起名字,比如CairoBuild。
先下载每个项目,cairo和pixman用git下就可以了,libpng和zlib在网上搜一下应该都能找到。下载的libpng是lpng1513,需要改名为libpng
将libpng和zlib解压,并放到Cario目录下,
这时的目录结构式
Cairo
cairo
pixman
libpng
zlib
Cairo的编译工作首先是 libpng和zlib的编译,
zlib的编译,用VS2012打开zlib目录下的 contrib\vstudio\vc10中的zlibvc.sln
在 zlibvc.def中将VERSON去掉否则会报错的,之后在zlibvc和testzlib项目的属性->连接器->命令行中 的其他选项加入 /SAFESEH:NO
整体编译(release)一下就通过了。
libpng的编译:下载的libpng是lpng1513,改一下名字为libpng,用VS2012打开 libpng根目录下projects\vstudio中的vstudio.sln
打开后,会发现有一个zlib项目,将zlib目录下的相应文件加入进去,再编译,否则会提示找不到文件的。并在libpng pngtest pngvalid中属性页的包含目录中加入zlib的根目录
以保证能够找到zlib.h文件,之后将属性中常规下的目标文件名改为$(ProjectName),原来的是$(ProjectName)15,将pngtest和pngvalid中的链接器的输入中的附加依赖项的libpng15也改为libpng,其实这两个和libpng的生成关系不大。然后将Debug改为release Library,编译一下,通过。
之后就是编译pixman和cairo了,
这两个项目的编译需要使用MozillaBuild工具编译,下载MozillaBuild工具并安装,打开其安装目录X:\mozilla-build下,找到对应的.bat文件,由于这里使用VS2012所以是start-msvc11.bat文件,先不要着急双击,先使用记事本或者Notepad++编辑一下,
在其中加入对应的INCLUDE和LIB,这里需要注意一下,有时候在编译pixman的时候会提示找不到Config.h文件,这个文件在mozilla-build中moztools\include里,我加入的内容如下
set INCLUDE=%INCLUDE%;%MOZ_TOOLS%\include
加入编译目录
rem Root of cairo building
set CAIROROOT=E:\DrawSoftware\cairo
加入zlib和libpng的lib文件,当然你也可以再cairo目录下建一个lib文件夹,然后,把LIB=%LIB%%CAIROROOT%\cairo\lib文件夹,并把zlib.lib和libpng.lib拷到此文件夹中
rem Add zlib and libpng to LIB
set LIB=%LIB%;%CAIROROOT%\zlib\contrib\vstudio\vc10\x86\ZlibStatRelease;%CAIROROOT%\libpng\projects\vstudio\Release Library
添加zlib和libpng的位置
rem Add zlib and libpng to INCLUDE
set INCLUDE=%INCLUDE%;%CAIROROOT%\zlib;%CAIROROOT%\libpng
加入cairo及其相关目录
rem Add cairo, boilerplate, and pixman to INCLUDE
set INCLUDE=%INCLUDE%;%CAIROROOT%\cairo\src;%CAIROROOT%\cairo\boilerplate;%CAIROROOT\pixman\pixman
保存之后,找到cairo目录下的build文件夹,用notepad打开其中的Makefile.win32.common文件,找到zdll.lib,将其改为zlib.lib,并将目录只想对应的.lib文件夹,如果你向前面说的那样,建了个lib目录,将libpng.lib和zlib.lib放到cairo的lib中的话这里需要将CAIRO_LIBS += $(top_builddir)/../../libpng.lib改为CAIRO_LIBS += $(top_builddir)/lib/libpng.lib,将CAIRO_LIBS += $(top_builddir)/../../zlib.lib改为CAIRO_LIBS += $(top_builddir)/lib/zlib.lib,这样就能够找到这两个lib文件了,如果没有添加lib文件件,就需要定位到相应lib的生成位置上
双击打开start-msvc11.bat文件,cd 到pixman/pixman下,make -f Makefile.win32 "CFG=release" pixman就编译好了,应该不会出错,如果是config.h没找到,可以加一下moztools\include目录。
最后 cd到 cairo目录下,也执行make -f Makefile.win32 "CFG=release" 经过5、6分钟,就编好了,视机器情况不同时间也不一样。如果只编译dll可以
make -f Makefile.win32 dynamic "CFG=release" 。一般会在cairo中src的release目录中看到 cairo.dll文件,调用这个文件的使用需要使用
根目录下 cairo-version.h
src/cairo-features.h
src/cairo.h
src/cairo-deprecated.h
src/cairo-win32.h
src/cairo-script.h
src/cairo-ps.h
src/cairo-pdf.h
src/cairo-svg.h
src/release/cairo.dll
src/release/cairo-static.lib
另外在使用C#调用时,采用DllImport方式 并将其加入cdecl调用方式,
[DllImport(DllName,CallingConvention=CallingConvention.Cdecl)],否则签名会有问题,当然你也可以在cairo.h的导出中加入 __stdcall,呵呵