windows下编译skia和svg静态库
最近引用duilib時發現使用gdi+繪制有很多問題,之前做瀏覽器時使用skia庫,決定把底層繪制用skia替換,并且用skia的svg模塊支持矢量圖繪制。下面記錄skia庫的下載和編譯
官方文檔:
https://skia.org/user/download
https://skia.org/user/build
LLVM下載地址:
https://github.com/llvm/llvm-project/releases/tag/llvmorg-11.0.1
一、工具準備
- 一個翻墻工具
- 安裝vs2017或者vs2019,以及相關SDK(需支持c++17)
- git環境和python環境
- .LLVM編譯器(官方推薦編譯器), 強烈建議使用clang-cl編譯器,編譯速度更快,編出的庫體積更小,出錯幾率更小
二、源碼下載
? 1.下載depot_tools 用于編譯源碼,并設置環境變量
? git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'
? export PATH="${PWD}/depot_tools:${PATH}" ?#也可以手動添加環境變量
? 2.下載源碼,并同步第三方庫
? git clone https://skia.googlesource.com/skia.git
? # or
? # fetch skia
? cd skia
? python2 tools/git-sync-deps ? 這個是在同步第三方庫,一定要執行,否則編譯時會報錯找不到一些庫, python2出錯可以換成python
三、編譯
注意:把skia\bin的路徑添加到環境變量, 否則會提示找不到gn命令
1.編譯official_release x86 skia.lib(MT)
2.編譯release x86 skia.lib(MT)
gn gen out/Static --ide=vs --args="clang_win = \"C:\Program Files\LLVM\" is_debug=false target_cpu=\"x86\"" #注意把生成的out\Static\toolchain.ninja中 ”cmd.exe /c C:\Program Files (x86)\Windows Kits\10/bin/SetEnv.cmd /x86 &&“ 全部刪除 ninja -C out/Static3.編譯debug x86 skia.lib(MTd)
gn gen out/Static --ide=vs --args="clang_win = \"C:\Program Files\LLVM\" target_cpu=\"x86\" extra_cflags = [\"/MTd\"]" #注意把生成的out\Static\toolchain.ninja中 ”cmd.exe /c C:\Program Files (x86)\Windows Kits\10/bin/SetEnv.cmd /x86 &&“ 全部刪除 ninja -C out/Static4.編譯debug x86 skia.lib(MT)
gn gen out/Static --ide=vs --args="clang_win = \"C:\Program Files\LLVM\" target_cpu=\"x86\"" #注意把生成的out\Static\toolchain.ninja中 ”cmd.exe /c C:\Program Files (x86)\Windows Kits\10/bin/SetEnv.cmd /x86 &&“ 全部刪除 ninja -C out/Static5.編譯official_release x64 dll(MD)
gn gen out/Shared --ide=vs --args="is_official_build=true is_component_build=true skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_zlib = false skia_use_libwebp_decode = false skia_use_libwebp_encode = false skia_use_system_harfbuzz = false skia_use_system_icu = false skia_use_system_expat = false" ninja -C out/Shared6.編譯release x64 dll(MD)
gn gen out/Shared --ide=vs --args="clang_win = \"C:\Program Files\LLVM\" is_component_build=true is_debug=false" ninja -C out/Shared7.編譯debug x64 dll(MDd)
gn gen out/Shared --ide=vs --args="clang_win = \"C:\Program Files\LLVM\" is_component_build=true extra_cflags = [\"/MDd\"]" ninja -C out/Shared8.編譯debug x64 dll(MD)
gn gen out/Shared --ide=vs --args="clang_win = \"C:\Program Files\LLVM\" is_component_build=true" ninja -C out/Shared四、相關命令或參數說明
gn -help可以查看gn全部命令,以下為skia用到的部分
1.out/Static 生成靜態庫
2.out/Shared 生成動態庫,與is_component_build一起使用
3.ide=vs 構建vs工程, 可以使用ide=vs2019 指定構建vs2019工程
4.sln=skia 指定生成skia.sln,沒有該參數時生成all.sln
5.args 編譯相關參數,執行完gn gen后相關參數會保存在out/Static(Shared)/args.gn中,gn args out/Static(Shared) -list可查看相關參數,以下為用到的參數
- is_official_build參數 默認為false。是否使用無符號方式生成,等于true時編譯速度更快,編譯出的庫體積更小,內部有更好的優化,缺點是沒有符號無法調試。編譯發布版本時設置為true,其他時候設置為false
- clang_win參數 指定LLVM編譯器的安裝路徑
- target_cpu參數 指定編譯x64 還是x86 默認為x64
- is_debug參數 指定編譯debug還是release 默認為!is_official_build
- skia_use_foo參數,指定是否編譯第三方庫,例如 skia_use_libwebp_decode=false 不編譯libwebp解碼庫,skia_use_foo參數會覆蓋skia_use_system_foo參數,可根據需要編譯第三方庫
- skia_use_system_foo參數 是否使用系統路徑下的庫 例如 skia_use_system_libpng = false 不使用系統的libpng庫,使用skia自帶的libpng庫,編譯過程中發現系統少哪一個就把哪一個設為false。
- 注意:is_official_build=true時 skia_use_system_foo都會被置為true
- extra_cflags參數 添加或包含庫目錄,也可以指定一些其他配置,例如extra_cflags = [\"/MDd\"],生成運行時庫為MDd
- is_component_build參數 is_component_build默認為false,當被置為true,編譯成MD運行庫, false時編譯為MT運行庫。一般在編譯成dll時使用
五、問題記錄
1.編譯失敗,提示找不到third_party路徑下頭文件
缺少第三方庫 確認 python2 tools/git-sync-deps 執行成功
2.編譯失敗,提示找不到某個頭文件
確認該頭文件在哪個模塊,args參數中加上skia_use_system_foo=false foo為第三方庫模塊
3.編譯x86時,提示C:\Program 不是命令
注意把生成的out\Static\toolchain.ninja中 ”cmd.exe /c ?C:\Program Files (x86)\Windows Kits\10/bin/SetEnv.cmd /x86 &&“ 全部刪除
4.gn命令失敗
gn路徑添加到環境變量
六、導出svg模塊
編譯official_release lib時 svg模塊不會編譯,可在skia\BUILD.gn 的group("modules") 下面加上"modules/svg", 編出official_release版本的svg.lib
編譯非official_release lib時,svg.lib可正常編譯出來
編譯dll時,svg.dll都不會被編譯出來,加上"modules/svg",會導致編譯出錯,原因是svg.dll依賴的模塊沒有編譯或者導出,留待解決
?
總結
以上是生活随笔為你收集整理的windows下编译skia和svg静态库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深深自责
- 下一篇: kepware KEPServerEX与