Windows系统中使用MinGW-W64(gcc/g++或LLVM)编译Skia源码的方法
- 修改日期:2026-02-10
- 操作系统:Windows 11 64位版本
- 编译器:MinGW-W64 gcc/g++ or LLVM-MinGW
- 说明1:本文档介绍Windows系统中使用MinGW-W64(gcc/g++)或者LLVM-MinGW编译Skia源码的方法
- 说明2:该编译Skia源码的方法,是为了适配nim_duilib项目使用Skia库,如果用于其他库使用,可能需要修改编译参数
- 说明3:获取skia源码后,需要更新部分源码(更新方法见后续文档),否则编译无法通过。(使用了一个第三方库:expat)
- 说明4:操作过程中,假设源码的根目录是
D:\develop目录,如果使用其他目录,可替换为实际的目录。
一、准备工作:安装必备的软件
- 安装python v3.11.x(如果本机已经安装了python v3,可以跳过这个步骤)
(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,可以跳过这个步骤)
(git需要添加到Path环境变量,确保命令行参数中可以访问到git.exe)
(1)Git For Windows: 2.44版本
(2)TortoiseGit:2.15版本 - 获取MinGW-w64编译环境(如果本机已经安装了MinGW-w64,可以跳过这个步骤)
(1)下载网址:https://www.mingw-w64.org/downloads/
(2)mingw64 LLVM(推荐)
下载地址:https://github.com/mstorsjo/llvm-mingw/releases
下载链接:https://github.com/mstorsjo/llvm-mingw/releases/download/20250430/llvm-mingw-20250430-ucrt-x86_64.zip
下载后解压到目录:C:\mingw64目录,gcc/g++最终目录为:C:\mingw64\llvm-mingw-20250430-ucrt-x86_64\bin
(3)mingw64 gcc/g++
下载地址:https://github.com/niXman/mingw-builds-binaries/releases
下载链接:https://github.com/niXman/mingw-builds-binaries/releases/download/15.1.0-rt_v12-rev0/x86_64-15.1.0-release-win32-seh-ucrt-rt_v12-rev0.7z
下载后解压到目录:C:\mingw64目录,gcc/g++最终目录为:C:\mingw64\x86_64-15.1.0-release-win32-seh-ucrt-rt_v12-rev0\mingw64\bin
二、使用脚本自动编译(推荐)
该脚本自动完成相关源码下载和编译工作。
选定一个工作目录,创建一个脚本build.bat,将下面已经整理好脚本复制进去,保存文件。
脚本文件内容如下:
echo OFF
set retry_delay=10
:retry_clone_skia_compile
if not exist ".\skia_compile" (
git clone https://github.com/rhett-lee/skia_compile
) else (
git -C ./skia_compile pull
)
if %errorlevel% neq 0 (
timeout /t %retry_delay% >nul
goto retry_clone_skia_compile
)
.\skia_compile\mingw64\build_skia_all_in_one.bat
进入命令行控制台,设置PATH环境变量(如果编译环境已经添加到PATH变量,可忽略这个步骤:
SET PATH=%PATH%;C:\mingw64\llvm-mingw-20250430-ucrt-x86_64\bin
最后运行该脚本:
.\build.bat
编译时如果获取skia_compile代码失败,可以多重试几次。
编译完成的库文件在工作目录的skia/out子目录中,按编译选项放在相应的子目录。
三、手动编译过程
第1步:获取skia源码和修改的源码
- 获取skia源码:
(1)>mkdir D:\develop
(2)>cd /d D:\develop
(3)>git clone https://github.com/google/skia.git
(4)>git checkout 34aa71b8bee4648a442b7125680232d803374f19 - 应用修改的代码:
(1)>cd /d D:\develop
(2)>git clone https://github.com/rhett-lee/skia_compile(下载源码和文档)
(3) 解压skia.2026-02-10.src.zip到目录skia.2026-02-10.src中
(4) 将目录skia.2026-02-10.src中的所有内容,复制到D:\develop\skia目录中,覆盖所有同名文件
(5) 注意事项:该修改的代码的SHA-1值,需要比对,如果不是这个版本的代码,直接覆盖可能有问题。
第2步:编译skia(编译器:mingw64 llvm)(推荐)
- 运行cmd.exe命令行环境
- 设置PATH环境变量:
>SET PATH=%PATH%;C:\mingw64\llvm-mingw-20250430-ucrt-x86_64\bin
>clang++ -v - 进入skia源码目录:
>cd /d D:\develop\skia - 编译skia静态库(mingw64 llvm,x64)
.\bin\gn.exe gen out/mingw64-llvm.x64.release --args="target_cpu=\"x64\" cc=\"clang\" cxx=\"clang++\" 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 skia_enable_svg=true skia_use_expat=true skia_use_system_expat=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]".\bin\ninja.exe -C out/mingw64-llvm.x64.release
- 编译skia静态库(mingw64 llvm,x86)
.\bin\gn.exe gen out/mingw64-llvm.x86.release --args="target_cpu=\"x86\" cc=\"clang\" cxx=\"clang++\" 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 skia_enable_svg=true skia_use_expat=true skia_use_system_expat=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]".\bin\ninja.exe -C out/mingw64-llvm.x86.release
第2步:编译skia(编译器:mingw64 gcc/g++)
- 运行cmd.exe命令行环境
- 设置PATH环境变量:
>SET PATH=%PATH%;C:\mingw64\x86_64-15.1.0-release-win32-seh-ucrt-rt_v12-rev0\mingw64\bin
>g++ -v - 进入skia源码目录:
>cd /d D:\develop\skia - 编译skia静态库(mingw64 gcc/g++,x64)
.\bin\gn.exe gen out/mingw64-gcc.x64.release --args="target_cpu=\"x64\" cc=\"gcc\" cxx=\"g++\" 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 skia_enable_svg=true skia_use_expat=true skia_use_system_expat=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]".\bin\ninja.exe -C out/mingw64-gcc.x64.release
- 编译skia静态库(mingw64 gcc/g++,x86)
.\bin\gn.exe gen out/mingw64-gcc.x86.release --args="target_cpu=\"x86\" cc=\"gcc\" cxx=\"g++\" 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 skia_enable_svg=true skia_use_expat=true skia_use_system_expat=false is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]".\bin\ninja.exe -C out/mingw64-gcc.x86.release
四、资源链接
- Skia的编译文档库,如需获取最新版本的文档,请点击访问:skia_compile
- nim_duilib界面库的代码库,请点击访问:nim_duilib
nim_duilib 是一款基于C++开发的跨平台界面库,源于经典的 duilib 界面库并进行了深度优化与功能扩展,支持Windows/Linux/macOS/FreeBSD平台,支持的Linux系统包括OpenEuler、OpenKylin、UbuntuKylin、统信UOS、中科方德、Ubuntu、Fedora、Debian等,专注于简化桌面应用的高效开发。其设计融合了DirectUI理念,通过XML描述界面布局,实现视觉与逻辑的分离,显著提升开发灵活性与维护性。