1. 程式人生 > >在Windows下編譯多種VS版本的Skia

在Windows下編譯多種VS版本的Skia

************************************************************************************************************************************************************************

感謝深圳-Jober和河北-Redrain的耐心指導

現在進行自我總結:

翻牆

        沒問題\?:<因為依賴一些第三方庫,skia本身還不全,錯誤理解,是依賴第三方庫>除非你電腦搭建了vpn,翻牆一點問題都沒有不然就不要考慮使用python進行編譯.<備註,當前下的版本請參照當前版本編譯,可能版本有有變化>


        有問題\?:看版本,最新版沒cmake目錄以及cmake編譯支援.然後後面我本人就用了m44版本,因為不需要翻牆,直接進行skia編譯.

*************************************************************************************************************************************************************************

        這幾天剛改了改Duilib,之前為了讓Duilib更好的支援透明異形窗體所以把Duilib改為Gdi和Gdi+的雙渲染引擎。於是想到了有時間就把渲染引擎完全獨立為渲染介面,可以增加更多的渲染引擎。現在來說Skia是個很不錯的渲染,之前我只是單獨編譯了VS2013的Skia做來簡單的測試使用,要想把它加到Duilib就得完全編譯好Skia並且支援各個版本的VS。

        為了搞好各個版本的Skia,花了一天時間才弄得差不多,之間出現不少問題。在網上的Skia編譯教程都太老了,不適用於當下的Skia版本了,所以專門把編譯過程記錄在這裡方便以後檢視。

       要編譯Skia會用到谷歌的gyp工具,這個工具可以構建出我們需要的sln等專案檔案。使用這個工具前,需要先設定兩個環境變數。

      一、增加GYP_GENERATORS環境變數。1、可以設定為ninja,這樣的話最後不會生成VS專案檔案,而是讓我們自己用depot_tools工具包中的ninja來手工編譯(沒啥特別需求就別用這個了)。2、設定為msvs-ninja,這樣的話會生成VS專案檔案,但是編譯的時候還是依靠ninja來讓VS自動編譯。3、設定為msvs

,這樣子的話會直接生成VS專案檔案,不依賴ninja。我只需要Windows的Skia,所以毫不猶豫的設定為msvs。

      二、增加GYP_MSVS_VERSION環境變數。這個環境變數用來指定生成的VS的版本(可以設定為2013,表示VS2013;還能設定2012、2008等等),對於新版本的Skia,只能用2013,所以這個變數不設定也可以。

VS2013版本:

        Skia的官網為:https://skia.org/。網站裡面有Skia在各個系統的編譯教程。我按照Windows的編譯教程搞了挺長時間。按照官網的方法,需要的編譯環境為:

        VS2013

        depot_tools

        Git(用於檢出depot_tools和Skia)

        Python2.7版本(一定要2.7這個版本的,安裝完後設置好python的環境變數)

        Cygwin(這個很必要,直接用Windows命令列會出問題)

       但是有個很尷尬的問題,那就是翻牆。如果按照教程來編譯的話,首先是要檢出depot_tools和Skia,然後就發現無法連線到伺服器,好在有Github,在上面也有最新版本對應的程式碼,所以我轉到Github去檢出depot_tools和Skia

      在按照教程編譯時,執行命令:

  1. cd %SKIA_CHECKOUT_DIR%  
  2. SET "GYP_GENERATORS=ninja,msvs"
  3. python bin/sync-and-gyp  
  4. SET "GYP_GENERATORS="

      然後同樣很悲劇,sync-and-gyp指令碼會自動下載編譯Skia所需的所有第三方庫和環境,但是由於無法翻牆,大多數第三方庫都沒法下載,自然也無法編譯!很尷尬的搞了半天都沒成功。

   當最後覺得沒法辦的時候。突然發現當下新版本的Skia原始碼裡面有個cmake目錄,裡面居然有CMakeLists.txt檔案。眼前一亮,我用cmake。執行命令:

  1. cd %SKIA_CHECKOUT_DIR%  
  2. cd cmake  
  3. cmake .  

       直接生成了VS2013的工程檔案!然後開啟工程直接編譯,沒出現任何問題就生成了Skia.dll和一個demo程式,執行時一切正常!不需要depot_tools、python、cygwin、gyp,也不需要任何第三方庫(實際上所需的很多第三方庫都是給linux、mac等環境用的,比如jepg、png解析庫,Windows並不需要,Skia在Windows中直接用WIC解析圖片)。只需要Skia原始碼和cmake,三句程式碼指定搞定!而且生成的是一個單獨的Skia.dll動態連結庫,不像原來的Skia會生成一堆靜態庫檔案。Skia要是早點附加個CMakeLists.txt就不需要那麼麻煩了。

        我又換命令去嘗試生成VS2008、2010、2012等版本的Skia

  1. cd %SKIA_CHECKOUT_DIR%  
  2. cd cmake  
  3. cmake . -G "Visual Studio 9 2008"  

       不過很遺憾,雖然最新版本的Skia雖然生成VS工程檔案很簡單了,但是由於新程式碼用到很多C++11的特性,所以只支援VS2013版本,其他VS編譯時都會報錯,更別說VS2008了。

      如果要讓生成Skia.dll支援xp sp3系統,需要對專案屬性做如下修改:

     1. 專案選單->專案屬性->配置屬性->常規->平臺工具集,選擇“VS2013WindowsXP(v120_xp)”
  2. 專案選單->專案屬性->連結器->系統->所需的最低版本,設定為5.01


     3.開啟sln後,找到ports專案,找到裡面的”SkFontMgr_win_dw_factory.cpp“原始檔並且移出,把“src/ports/SkFontMgr_win_gdi_factory.cpp”,再新增到ports專案(這是把DWrite渲染方式改為GDI渲染,原因我在後面說)

       如果要支援到xp sp2系統,還需要另外設定:

       C/C++->程式碼生成->執行庫,選擇“多執行緒(/MT)";

       這樣做完,就算是圓滿的編譯好了Skia最新版本,但是這個並不能滿足我的需求。因為最新版本的Skia必須要用VS2013編譯,意味著最終程式必須附帶VS2013的執行時庫,而很多時候專案用的Duilib版本不是VS2013,這樣會增加程式體積,也可能導致其他相容性問題。所以還是需要編譯出其他版本的Skia,既然最新版本Skia不支援,那就只能試試老版本的了

VS2010和VS2012版本:

        從Github檢出Skia後,我瀏覽Skia版本庫歷史,嘗試了編譯很多個時間段的Skia,最終選擇了一個2014年的Skia,這個版本的相對來說比較新,可以滿足需求,同時也可以做出VS2008到VS2013版本的所有專案檔案。我檢出的版本為2014.4.11日的:



       編譯VS2010版本的Skia也比較簡單(2010直接升級就能用於2012和2013)。需要的環境如下:

      VS2010

       設定環境變數GYP_MSVS_VERSION為2010

       Python2.7(安裝完後設置好python的環境變數

       Cygwin(安裝過程中提示安裝package時找到python,把這個package裝上)

       Skia依賴的第三方庫

       其中Cygwin很重要,我一開始沒用Cygwin而是直接用cmd,去編譯的時候,python總會執行錯誤,需要在Cygwin環境下執行命令。

      在最新版本的Skia中,原本的syna-and-gyp指令碼會自動下載所需的第三方庫和各種環境,但是老版本的Skia沒有這種指令碼,就需要我們自己下載了。我會把我下載好的Skia依賴第三方庫檔案上傳到我的Github上。在Skia的third_party目錄新建externals目錄,把第三方庫檔案放到externals目錄就可以了,其中包括gyp(用來生成sln,這個很重要)。

     這些準備好後,啟動Cygwin,執行命令:

  1. <span style="font-size:14px;">cd d:/skia/skia #這裡替換為你的Skia檢出目錄,用英文目錄
  2. python gyp_skia</span>  

    執行完畢後,如果一些順利,就會生成out目錄,裡面有生成好的VS2010工程檔案,把它可以升級為2012或者2013的。然後開啟工程直接編譯就OK了,編譯時會出現錯誤:“警告視被為錯誤”,修改對應專案的屬性:“C/C++->常規->將錯誤視為警告:否”就可以了。

     但是有的版本的Skia編譯時會提供一些檔案缺失的錯誤,這時就要看錯誤原因,如果是缺少第三方庫那就需要我們自己再去下載對應的第三方庫補充到externals目錄。如果是缺失Skia本身的檔案,就可以從Git中找到缺失的檔案補充好(理論上不應該出現這個問題,但是我的確遇到了,不過重新檢出了一下就沒問題了)。不過經過我的測試,我檢出的這個2014.4.11版本的Skia配合我的第三方庫,編譯時一切正常。

      至此,VS2010到VS2013的所有版本都可以編譯出來了。但是最麻煩的是VS2008,我單獨搞了挺長時間才搞出來2008版本的Skia。

VS2008版本:

        所需的環境和Skia版本與VS2010的完全一樣,就不再贅述了。為什麼編譯VS2008的最麻煩?原因如下:

       1、Skia的原始碼原本最低就是支援VS2010的,沒有考慮VS2008,用gyp工具生成的預設也是VS2010(當然也可以修改環境變數生成出VS2008版本)。

       2、在Windows中,Skia渲染字型有兩種方式:GDI或者DWrite,而Skia預設的渲染方法是用DWrite,但是VS2008不支援沒有DWrite的標頭檔案(VS2010開始支援),所以會出現編譯錯誤。另外XP系統不支援DWrite,所以如果想讓編譯出來的Skia支援XP系統,就需要把DWrite渲染方式改為GDI(這也是在編譯VS2013那一節中我提到要替換檔案的原因)

     由於這兩個原因,所以需要修改一些專案和原始碼,才能順利編譯出支援xp和VS2008的Skia。

     首先說一下生成2008工程檔案的方法。

    正常情況下,設定環境變數GYP_MSVS_VERSION為2008,然後按照VS2010的生成方法,就能生成出VS2008的專案檔案。

    但是在我嘗試生成了很多個版本的Skia後發現,很多情況下,可能是gyp指令碼編寫有問題,會生成出預設的VS2010專案檔案而無法生成VS2008的。如果按照上面的方法沒有出現VS2008的專案檔案,就需要強行修改一點gyp指令碼了。找到"skia\third_party\externals\gyp\pylib\gyp\MSVSVersion.py"檔案,這個檔案負責gyp生成的VS版本,找到如下程式碼:

  1. # In auto mode, check environment variable for override.
  2. if version == 'auto':  
  3.   version = os.environ.get('GYP_MSVS_VERSION''auto')  
  4. version_map = {  
  5.   'auto': ('10.0''12.0''9.0''8.0''11.0'),  
  6.   '2005': ('8.0',),  
  7.   '2005e': ('8.0',),  
  8.   '2008': ('9.0',),  
  9.   '2008e': ('9.0',),  
  10.   '2010': ('10.0',),  
  11.   '2010e': ('10.0',),  
  12.   '2012': ('11.0',),  
  13.   '2012e': ('11.0',),  
  14.   '2013': ('12.0',),  
  15.   '2013e': ('12.0',),  
  16. }  

        把其中幾個數字做出修改,這些數字程式碼VS的版本,我把預設的生成版本從VS2010改成了VS2008

  1. # In auto mode, check environment variable for override.
  2. if version == 'auto':  
  3.   version = os.environ.get('GYP_MSVS_VERSION''auto')  
  4. version_map = {  
  5.   'auto': ('9.0''12.0''9.0''8.0''11.0'),  
  6.   '2005': ('8.0',),  
  7.   '2005e': ('8.0',),  
  8.   '2008': ('9.0',),  
  9.   '2008e': ('9.0',),  
  10.   '2010': ('9.0',),  
  11.   '2010e': ('9.0',),  
  12.   '2012': ('11.0',),  
  13.   '2012e': ('11.0',),  
  14.   '2013': ('12.0',),  
  15.   '2013e': ('12.0',),  
  16. }  

         改完後儲存,然後開啟cygwin執行命令:

  1. cd d:/skia/skia #這裡替換為你的Skia檢出目錄,用英文目錄  
  2. python gyp_skia  

      這樣就會生成VS2008的專案檔案。但是隻生成了專案檔案還是不行,編譯時會出現很多錯誤。

      首先把最常見的”警告視為錯誤“的問題改掉。

      然後還會提示缺少"stdint.h",這是C++標準標頭檔案,但是VS2010才開始提供,所以我從VS2010找到這個標頭檔案,並且把他放到了"skia/src/core”目錄中(這個檔案我也會提交到Github)。

      最後我們開啟Skia解決方案,依次把工程裡的DWrite相關程式碼修改,替換為GDI的:

 1、找到“Util”專案,把其中“SkDwrite.cpp/.h”、”SkDwriteFontFileSteam.cpp/.h“、”SkDwriteGeometrySink.cpp/.h“這幾個用到dwrite的檔案移除掉:


   2、找到“Ports”專案,把SkRemotableFontMgr_win_dw.cpp和SkFontHost_win_dw.cpp檔案移除。


        3、如果上圖的位置中,包含的是”SkFontMgr_default_dw.cpp“檔案而不是”SkFontMgr_default_gdi.cpp“,那就用”SkFontMgr_default_gdi.cpp“替換SkFontMgr_default_dw.cpp

      4、開啟”src\core\skadvancedtypefacemetrics.cpp“檔案,把開頭的#include "dwrite.h"標頭檔案的語句註釋掉;然後在檔案中搜索如下程式碼並且註釋掉:

  1. template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData(  
  2.         IDWriteFontFace* fontFace,  
  3.         int num_glyphs,  
  4.         const uint32_t* subsetGlyphIDs,  
  5.         uint32_t subsetGlyphIDsLength,  
  6.         bool (*getAdvance)(IDWriteFontFace* fontFace, int gId, int16_t* data));  

      如果有其他的關於dwrite.h的錯誤,也類似的修改一下就可以了。做完這些後,就可以用VS2008編譯生成Skia了。當然,由於可能其他人用其他版本的Skia,所以我說的步驟裡面的檔案和一些具體的程式碼可能會有差別,但是照貓畫虎類似的改改就可以了。

用cmake生成VS2008版本的單一檔案skia:

       在生成好上面說的VS2008版本的Skia後,我又想到了既然最新版本的Skia支援用cmake生成解決方案,那我應該也能自己為老版本的Skia寫個CMakeLists.txt來各種版本的Skia。倒騰了一上午,還真搞出來了···,gyp生成的解決方案最麻煩的就是他會把skia拆分為很多個靜態庫檔案,我們要用的話還得依次連結多個靜態庫檔案,用起來很不爽。而用cmake可以生成一個單一的解決方案,編出來就是一個單獨的skia,用起來方便多了。

      我把最新版的Skia的cmake目錄的CMakeLists.txt檔案拷貝到前面說的老版本的Skia目錄。當然了,這個CMakeLists.txt肯定沒法直接用,我對照著新版和老版的Skia的檔案差異,修改了CMakeLists.txt,最終使用命令:

  1. cd %SKIA_CHECKOUT_DIR%  
  2. cd cmake  
  3. cmake . -G "Visual Studio 9 2008"

      生成了VS2008的解決方案,但是這個解決方案是沒法直接編譯的,因為skia涉及的檔案有點多,我改的CMakeLists.txt不夠完善。所以我編譯解決方案,根據提示的錯誤,移出多餘的原始檔,修改了不少地方,終於是編譯陳功了。但是由於改的步驟不較多,也比較亂,所以我就不專門說明修改步驟了。我把最終生成的VS2008解決方案上傳到Github。

      這個VS2008的Skia是我想要的最理想的版本。首先由於這是VS2008版本,所以可以很容易升級到VS2013等高版本的VS,而且直接編譯,這就滿足了實際開發對多種VS版本的需求。其次修改後完全支援xp系統。最後生成的是一個單獨的Skia.dll檔案,使用簡單方便。


      生成的release版本的skia.dll大小是1.82M。不過我是用dll版本的Skia發現由於原始檔中由於Skia有一些類沒有匯出,所以有一些功能沒法使用。所以建議還是修改工程屬性,生成skia的靜態庫,就可以使用完整的skia功能。如果使用靜態庫的skia,最終的exe大概會增加1.5M的體積,我感覺是可以接受的大小。

     最後,我再附加一個使用這個skia靜態庫的demo。簡單做了個半透明的窗體,附加了文字特效。程式碼比較簡略,湊活著看吧,主要就是測試功能是否正常。這裡提示一下,使用skia靜態庫時記得連結這幾個庫檔案:OpenGL32.lib、usp10.lib、DelayImp.lib、windowscodecs.lib

相關推薦

Windows編譯多種VS版本Skia

****************************************************************************************************************************************

Skia簡介以及在Windows編譯操作步驟

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Windows編譯xgboost的C++原始碼(方便vs執行的)

(作者:陳玓玏) 1、 下載原始碼: 網址:https://github.com/dmlc/xgboost ,最好不要直接下載zip,而是克隆,因為直接下載會下載不到xgboost依賴的dmlc-core和rabbit等庫,導致編譯失敗。克隆的好方法是通過git

Windows編譯最新版本的Libjingle

Libjingle版本: 0.5.2作業系統: Windows XP編譯器: Microsoft Visual C++ 2008 Express具體可以參考README:http://code.google.com/p/libjingle/source/browse/trunk/README這

Windows編譯並使用libcurl(curl:http客戶端庫c++版本

一、下載最新版本libcurlhttps://curl.haxx.se/libcurl/    二、編譯 解壓進入curl-curl-7_59_0\winbuild\下 靜態庫,debug nmake /f Makefile.vc mode=static VC=14 DE

Windows編譯Lua

play pre functions aries programs mem lba other pil http://blog.csdn.net/yue7603835/article/details/41739085 http://blog.csdn.net/birdfl

Windows編譯WebRTC

obj 自己 war invalid bds amd clu out tail 前言 這篇文章的目的在於為你節省生命中寶貴的10小時(甚至更多),或者浪費你10分鐘。作為Google更新頻繁的大型跨平臺基礎庫,WebRTC的編譯一直被人稱為噩夢。如果恰巧你偏要在Windo

windows編譯python3.6

python3 pytho sof 3.6 只需要 bsp .exe .cn 技術分享 在pcbuild文件夾下找到pcbuild.sln文件.在readme裏面有 Install Microsoft Visual Studio 2015, any edition. 所

windows編譯qt的mysql驅動

dot god sql plugins dep .com .html path h+ windows下編譯qt的mysql驅動cd %QTDIR%\src\plugins\sqldrivers\mysqlqmake –o Makefile INCLUDEPATH

Windows編譯MySQL 5.7源代碼

tro col uic align 安裝 nbsp 安裝路徑 目錄 img Windows下編譯MySQL 5.7源代碼 前提準備 ====== Visual Studio 2013: MySQL 5.7源代碼:可以從這裏下載: http://dev.mysql.co

Windows編譯nginx-rtmp-module

win10 threshold tar ram 1.2 openss direct down 0.11 http://nginx.org/en/docs/howto_build_on_win32.html 官網上的操作說明。 官網的方法Nginx編譯方法,思路是一致的,只是

Windows編譯Python2.7源碼

dll 虛擬 命令 src nco cnblogs arr appdata 配置 本文開始一個系列文章,深入理解Python源碼,算是閱讀《Python源碼剖析》一書的讀書筆記,是一項長期進行的工作。一共分三個部分:Python對象模型,Python虛擬機,Python模塊

windows svn刪除與版本庫的聯系

項目 edi tle folder sse delete com nbsp 5.0 當項目和版本庫有聯系時每個目錄下都會有.svn批量刪除時可將下列代碼復制 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\S

windows編譯調試nginx

無法 pat temp linux命令 setup 易用 down nag exe typora-copy-images-to: image windows下編譯調試nginx linux使用gdb跟蹤代碼效率不高,在通過跟蹤代碼進行源碼分析,與定位復雜邏輯問題時,如果有

Windowspython 3.0版本django的安裝、配置、與啟動

減少 操作 註意 class lin img 裏的 bubuko code 使用的環境是Windows操作系統,python的環境是3.6,django是官網上最新的版本1.10.6,本文介紹從安裝python之後怎樣用過pip管理工具安裝django,以及django的項

windows 編譯tensorflow c++庫過程記錄

生成 native uil 定義 arch lin share lock bsp 1. 準備 windows 10系統、3.6GHz cpu、16G 內存 visual studio 2017 or 2015 下載安裝git 下載安裝cmake 下載安裝swi

windows編譯google-protocolbuf在Qt中使用

arr protobuf close gif fixed 放置 導出 內容 serialize 1.首先從Github-Protobuf下載代碼,本文下載的版本號是3.1.0. 2.仔細查看各個README,有相關的資源下載和編譯說明. 3.在一個方便的地方創建一個Ins

windows編譯nginx+nginx_rtmp_modue(vs2013)

path href select 簡單 選項 win32 fastcgi rtc cef 閱讀官方編譯windows版本的方法 http://nginx.org/en/docs/howto_build_on_win32.html 我的環境 Windows 7 Ultima

[轉]windows多個python版本共存,pip使用

啟動 article xxx box 似的 而是 就是 3.3 代碼 windows下多個python版本共存,pip使用 2017年09月13日 17:21:30 閱讀數:2574 一、同時裝了Python3和Python2,怎麽區分 了解pytho

windows編譯arm-linux

arm 分享圖片 ext tps 工具 習慣 技術分享 down c++ 本文主要參考:在windows環境下,使用Eclipse和gcc-Linaro工具鏈,對BeagleBone進行交叉編譯和遠程部署 不習慣在linux編譯代碼,所以想在windows下整個環境出來。