cario windows 下編譯
什麼是Cairo
cairo是一個小型的2D圖形庫,支持Linux、Windows、macOS X等平臺。封裝了一部分在當前平臺上的圖形API,或是直接訪問底層接口。他支持win32、x-window、svg、opengl等多種輸出設備。cario的編譯相對比較簡單,但是在windows下遇到各種問題,就是沒有很好的解決辦法
你需要準備什麼
MSYS2
在windows下模擬liunx的環境的軟件,MSYS 是用於輔助 Windows 版 MinGW 進行命令行開發的配套軟件包,提供了部分 Unix 工具以使得 MinGW 的工具使用起來方便一些。如果不喜歡龐大的 Cygwin,而且使用不多,可以試試。不過喜歡完整體驗、不在乎磁盤佔用等等,還是推薦 Cygwin 而不是 MSYS。
MSYS2的配置
-
按正常的方式安裝,沒啥特別之處。
-
修改
panman
源
類似於linux下的源更新環境,只是MSYS2使用的組件包更新工具是
pacman
,pacman是一個包管理器,可以方便的下載各種軟件,使用挺簡單的。
修改更新源
進入msys64/etc/pacman.d/目錄中,分別在三個文件中增加
mirrorlist.mingw32
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
mirrorlist.mingw64
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
mirrorlist.msys
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
- 更新MSYS2內的核心組件
打開msys,輸入pacman -Syu 更新核心組件,更新之後需要重啓msys(有的時候可能要重啓電腦)
- 安裝常用庫
//安裝mingw64
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
//安裝zlib
pacman -S zlib //這個不需要源碼編譯;
//安裝make
pacman -S make
//安裝automake
pacman -S automake
//安裝pkg-config
pacman -S pkg-config
//安裝autoconf
pacman -S autoconf
- 設置環境變量(如下圖)
編譯pixman
- 下載pixman 源碼地址 https://www.cairographics.org/releases/
- 啓動msys下的mingw64.exe
- 執行編譯
./configure
make
make install
其他依賴編譯
Cario編譯
notes:按官網的方式是使用MozillaBuild(與msys環境類似,不過編譯器使用的是vs編譯器,我嘗試編譯發現有很多錯誤,最新版本的 MozillaBuild
並沒有各個VS的腳本配置文件,我的版本是VS2017,通過這種方式編譯不過)
./configure
make
make install
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMTQ2MjYwNS8xNTkwNzM3MTI0MDEyLTMxMDc5Y2Q4LWMzNDktNGRkNS04YTFhLTVmMjhkMTdlY2UxOC5wbmc?x-oss-process=image/format,png#align=left&display=inline&height=496&margin=[object Object]&name=image.png&originHeight=991&originWidth=852&size=122633&status=done&style=none&width=426)
可能會出現以下問題
1、
fatal error: ft2build.h: No such file or directory
解決辦法:缺少freetype庫,可以去下載源碼按pixman的編譯方式編譯
2、undefined reference to __strncat_chk
解決辦法,找到cario目錄下查找所有文件內容-D_FORTIFY_SOURCE=2
替換爲空字符串,這個問題找了好久才找到,或者是修改
configure.ac文件中的LIBS=’$LIBS -lssp’(這個好像不好找)
生成成功之後的文件有:
libcairo.dll
libcairo.dll.a
簡單測試
#pragma comment(lib, "libcairo.dll.a") //網上有.a文件轉成lib的方法,後來發現可以直接使用
void main()
{
cairo_surface_t* a1 = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 100, 100);
cairo_t* cr1= cairo_create(a1);
cairo_save(cr1);
cairo_set_operator(cr1, CAIRO_OPERATOR_SOURCE);
cairo_set_source_rgb(cr1, 0, 1, 1);
cairo_rectangle(cr1, 10, 10, 80, 80);
cairo_restore(cr1);
}