cario windows 下編譯

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
  • 設置環境變量(如下圖)

image.png

編譯pixman

./configure
make
make install

基本可以順利編譯完成

其他依賴編譯

  • 按類似的方法編譯 libpng freetype

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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章