Windows下编译Skia源码的方法
- 修改日期:2024-05-12
- 操作系统:Windows 11 64位版本
- 编译器可选择:LLVM 或者 Visual Studio 2022 中的一种
- 操作过程中,源码的根目录是D:\develop目录,如果使用其他目录,可替换为实际的目录。
一、准备工作
- 安装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:18.1.5 Win64 版本(更高版本也可以)
(1)安装目录:C:\LLVM
(2)注意事项:安装目录中,不能有空格,否则编译会遇到问题。 - 获取skia源码及相关依赖:
(1)建立目录:D:\develop
(2)>cd /d D:\develop
(3)>git clone https://github.com/google/skia.git
(4)备注:skia源码更新的日期:2024-05-12
(5)备注:skia库对应的SHA-1: 4e9362762a0fc730b6f6359b8a626a0b1cc9ba9f
(6)更新修改代码:- 下载需要更新的代码到本地:
git clone https://github.com/rhett-lee/skia_compile
- 更新文件:解压Skia.2024-05-12.src.zip,将解压后的文件,覆盖D:\develop\skia目录中的所有同名文件。
- 注意事项:该修改的代码是基于库的SHA-1: 4e9362762a0fc730b6f6359b8a626a0b1cc9ba9f 代码修改,如果不是这个版本的代码,直接覆盖可能有问题,需要手工修改;
- 修改代码解决的问题:
- 修改了DEPS、tools/git-sync-deps两个文件:解决部分第三方依赖库获取不到源码的问题;
- 修改部分其他源码:解决LLVM编译生成的lib,使用Visual Studio链接生成可执行程序后,运行时崩溃问题。
- 下载需要更新的代码到本地:
- 更新依赖代码:切换到skia目录,执行脚本,更新依赖的第三方库
(1)>cd /d D:\develop\skia
(2)>python tools/git-sync-deps
(3)注意事项:这里配置的zlib是google的优化版本,不是zlib官方的版本,如果使用官方版会有编译错误
(4)注意事项:更新依赖库的时候,如果遇到github网络错误,需要反复执行,直到成功为止
二、编译gn.exe(编译skia源码时需要用到gn.exe)
- 下载源码:
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。
三、编译skia(编译器:LLVM)
(1)编译64位的Lib(x64版本)
- 首先进入VS 2022的64位命令行编译环境: (x64 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(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=\"18\" is_official_build=true skia_use_system_libpng=false skia_use_system_libjpeg_turbo=false skia_use_system_zlib=false skia_use_icu=false skia_use_expat=false skia_use_libwebp_decode=false skia_use_libwebp_encode=false skia_use_xps=false skia_enable_pdf=false is_debug=false"
ninja -C out/LLVM.x64.Release
- 编译skia静态库(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=\"18\" is_debug=true extra_cflags=[\"/MTd\"]"
ninja -C out/LLVM.x64.Debug
(2)编译32位的Lib(x86版本)
- 首先进入VS 2022的32位命令行编译环境: (x86 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(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=\"18\" is_official_build=true skia_use_system_libpng=false skia_use_system_libjpeg_turbo=false skia_use_system_zlib=false skia_use_icu=false skia_use_expat=false skia_use_libwebp_decode=false skia_use_libwebp_encode=false skia_use_xps=false skia_enable_pdf=false is_debug=false"
ninja -C out/LLVM.x86.Release
- 编译skia静态库(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=\"18\" is_debug=true extra_cflags=[\"/MTd\"]"
ninja -C out/LLVM.x86.Debug
四、编译skia(编译器:Visual Studio 2022)
(1)编译64位的Lib(x64版本)
- 首先进入vs 2022的64位命令行编译环境:(x64 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(Release版本,官方版,最小依赖,生成Visual Studio 2022工程)
.\bin\gn.exe gen out/vs2022.x64.Release --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" is_official_build=true skia_use_system_libpng=false skia_use_system_libjpeg_turbo=false skia_use_system_zlib=false skia_use_icu=false skia_use_expat=false skia_use_libwebp_decode=false skia_use_libwebp_encode=false skia_use_xps=false skia_enable_pdf=false is_debug=false"
ninja -C out/vs2022.x64.Release
- 编译skia(Debug版,非官方版本,完整,生成Visual Studio 2022工程)
.\bin\gn.exe gen out/vs2022.x64.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x64\" is_debug=true extra_cflags=[\"/MTd\"]"
ninja -C out/vs2022.x64.Debug
(2)编译32位的Lib(x86版本)
- 首先进入vs 2022的32位命令行编译环境:(x86 Native Tools Command Prompt for VS 2022)
- 进入skia源码目录:
>cd /d D:\develop\skia
- 编译skia静态库(Release版本,官方版,最小依赖,生成Visual Studio 2022工程)
.\bin\gn.exe gen out/vs2022.x86.Release --ide="vs2022" --sln="skia" --args="target_cpu=\"x86\" is_official_build=true skia_use_system_libpng=false skia_use_system_libjpeg_turbo=false skia_use_system_zlib=false skia_use_icu=false skia_use_expat=false skia_use_libwebp_decode=false skia_use_libwebp_encode=false skia_use_xps=false skia_enable_pdf=false is_debug=false"
ninja -C out/vs2022.x86.Release
- 编译skia(Debug版,非官方版本,完整,生成Visual Studio 2022工程)
.\bin\gn.exe gen out/vs2022.x86.Debug --ide="vs2022" --sln="skia" --args="target_cpu=\"x86\" is_debug=true extra_cflags=[\"/MTd\"]"
ninja -C out/vs2022.x86.Debug
五、为何使用LLVM编译Skia:
因为LLVM编译的代码,执行性能明显比VS好。
用VS编译的代码,运行时有明显卡顿现象,尤其时Debug版。