上週寫一個遊戲(http://blog.csdn.net/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.csdn.net/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動態庫的參數設置的不一樣。