- 修改日期:2025-02-08
- 操作系统:Windows 11 64位版本
- 编译器可选择:LLVM 或者 Visual Studio 2022 中的一种
- 操作过程中,源码的根目录是D:\develop目录,如果使用其他目录,可替换为实际的目录
- 说明1:该编译Skia源码的方法,是为了适配nim duilib 项目使用Skia库,如果用于其他库使用,可能需要修改编译参数
- 说明2:最新的编译方法中,不再使用Skia中依赖的第三方库,所以不再需要运行
python tools/git-sync-deps
来获取第三方库的源码 - 说明3:为了提升Debug版本的运行性能,在Debug版本的编译中,使用Release版本相同的编译参数,只是把运行时库从/MT换成/MTd。
- 安装python v3.11.x(python的主版本需要是v3,需要添加到Path环境变量,以便于能够直接用python.exe启动python程序)
(1)首先安装python
(2)在Windows的设置里面,关闭python.exe和python3.exe的"应用执行别名",否则编译skia的脚本执行有问题。Windows设置入口:设置 -> 应用 -> 高级应用设置 -> 应用执行别名
(3)到python.exe所在目录中,复制一份python.exe,改名为python3.exe: 确保命令行参数中可以访问到python3.exe
(4)验证:确保命令行参数中可以访问到python.exe和python3.exe - 安装git,git需要添加到Path环境变量,确保命令行参数中可以访问到git.exe
(1)Git For Windows: 2.44版本
(2)TortoiseGit:2.15版本 - 安装Visual Studio 2022社区版(或者其他版本)
注意事项:在安装的时候必须要选择CMake扩展,自带Ninja编译工具,编译Skia源码的时候需要用到Ninja - 安装LLVM:19.1.7 Win64 版本(更高版本也可以)
(1)安装目录:C:\LLVM
(2)注意事项:安装目录中,不能有空格,否则编译会遇到问题。 - 获取skia源码及相关依赖:
(1)建立目录:D:\develop
(2)>cd /d D:\develop
(3)>git clone https://github.com/google/skia.git
(4)>git checkout 8e83e49cba3a28671d07661d88bddc3e84ae132d
(5)备注:skia源码更新的日期:Date: 2025/2/8 1:12:45
(6)更新修改代码:- 下载需要更新的代码到本地:
git clone https://github.com/rhett-lee/skia_compile
- 更新文件:解压
Skia.2025-02-08.src.zip
,将解压后的文件,覆盖D:\develop\skia目录中的所有同名文件。 - 注意事项:该修改的代码的SHA-1值,需要比对,如果不是这个版本的代码,直接覆盖可能有问题,需要手工修改;
- 修改代码解决的问题:修改部分其他源码:修复运行时的几个小问题。
- 下载需要更新的代码到本地:
- 下载源码:
https://github.com/rhett-lee/gn.git
(1)>cd /d D:\develop
(2)>git clone https://github.com/rhett-lee/gn.git
- 编译gn(注意:vs 2022 已经带了ninja.exe,在安装的时候选择了CMake扩展):
(1)首先进入vs 2022的命令行编译环境(x64 Native Tools Command Prompt for VS 2022)
(2)进入gn源码目录:cd /d D:\develop\gn
(3)>python build/gen.py
(4)>ninja -C out
- 复制gn.exe文件到skia源码目录
编译完成后,将out\gn.exe 复制到D:\develop\skia\bin\
目录中,编译skia过程中要用到这个gn.exe。
- 首先进入VS 2022的64位命令行编译环境: (x64 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(LLVM.x64.Debug)
.\bin\gn.exe gen out/LLVM.x64.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" cc=\"clang\" cxx=\"clang++\" clang_win=\"C:/LLVM\" clang_win_version=\"19\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MTd\"]"
ninja -C out/LLVM.x64.Debug
如果需要重新编译,可用以下命令清理编译的中间文件等文件:ninja -C out/LLVM.x64.Debug -t clean
以上编译的lib库是Release版,使用Debug版本的运行库,这样运行速度比较快,但不能够调试Skia的源码
如果开发中需要调试Skia的源码,那么需要编译出Debug版本的Lib库,可用使用以下命令生成编译选项(同时:将duilib的VC工程中的宏定义SK_RELEASE改为SK_DEBUG,这样编译后,就可用调试Skia的源码了):.\bin\gn.exe gen out/LLVM.x64.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" cc=\"clang\" cxx=\"clang++\" clang_win=\"C:/LLVM\" clang_win_version=\"19\" is_trivial_abi=false skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=true skia_enable_spirv_validation=false skia_use_expat=false skia_use_jpeg_gainmaps=false skia_enable_tools=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MTd\"]"
- 编译skia静态库(LLVM.x64.Release)
.\bin\gn.exe gen out/LLVM.x64.Release --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" cc=\"clang\" cxx=\"clang++\" clang_win=\"C:/LLVM\" clang_win_version=\"19\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MT\"]"
ninja -C out/LLVM.x64.Release
- 首先进入VS 2022的32位命令行编译环境: (x86 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(LLVM.x86.Release)
.\bin\gn.exe gen out/LLVM.x86.Release --ide="vs2022" --sln="skia" --args="target_cpu=\"x86\" cc=\"clang\" cxx=\"clang++\" clang_win=\"C:/LLVM\" clang_win_version=\"19\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MT\"]"
ninja -C out/LLVM.x86.Release
- 编译skia静态库(LLVM.x86.Debug)
.\bin\gn.exe gen out/LLVM.x86.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x86\" cc=\"clang\" cxx=\"clang++\" clang_win=\"C:/LLVM\" clang_win_version=\"19\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MTd\"]"
ninja -C out/LLVM.x86.Debug
- 首先进入vs 2022的64位命令行编译环境:(x64 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(vs2022.x64.Release)
.\bin\gn.exe gen out/vs2022.x64.Release --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MT\"]"
ninja -C out/vs2022.x64.Release
- 编译skia静态库(vs2022.x64.Debug)
.\bin\gn.exe gen out/vs2022.x64.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MTd\"]"
ninja -C out/vs2022.x64.Debug
- 首先进入vs 2022的32位命令行编译环境:(x86 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(vs2022.x86.Release)
.\bin\gn.exe gen out/vs2022.x86.Release --ide="vs2022" --sln="skia" --args="target_cpu=\"x86\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MT\"]"
ninja -C out/vs2022.x86.Release
- 编译skia静态库(vs2022.x86.Debug)
.\bin\gn.exe gen out/vs2022.x86.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x86\" is_trivial_abi=false is_official_build=true skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_libpng_encode=false skia_use_libpng_decode=false skia_use_zlib=false skia_use_libjpeg_turbo_encode=false skia_use_libjpeg_turbo_decode=false skia_enable_fontmgr_win_gdi=false skia_use_icu=false skia_use_expat=false skia_use_xps=false skia_enable_pdf=false skia_use_wuffs=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\",\"/MTd\"]"
ninja -C out/vs2022.x86.Debug
因为LLVM编译的代码,执行性能明显比VS好。
用VS编译的代码,运行时有明显卡顿现象,尤其时Debug版。