- 修改日期:2025-02-08
- 操作系统:UOS 20 专业版(1070) 64位版本
- 编译器可选择:LLVM
- 操作过程中,源码根目录是/home/develop目录,如果使用其他目录,可替换为实际的目录
- 说明1:该编译Skia源码的方法,是为了适配nim duilib 项目使用Skia库,如果用于其他库使用,可能需要修改编译参数
- 说明2:最新的编译方法中,不再使用Skia中依赖的第三方库,所以不再需要运行
python3 tools/git-sync-deps
来获取第三方库的源码
(说明:系统提供的开发工具版本比较低,不能满足要求,需要使用源码编译开发工具的最新版,包括gcc/g++、llvm/clang/clang++、gn等)
- 安装完成系统后,可用升级系统到最新:
(1)升级系统:sudo apt update
(2)升级系统:sudo apt upgrade
- 安装gcc/g++: 系统中用
sudo apt install gcc g++
安装,安装后的版本号为:8.3.0;
这个版本太低,不能用于编译skia和nim_duilib,需要手工编译最新版的gcc/g++,详见后续文档; - 安装gdb: 系统中用
sudo apt install gdb
安装,安装后的版本号为:8.2.1; - 安装make: 系统中用
sudo apt install make
安装,安装后的版本号为:4.2.1; - 安装cmake: 系统中用
sudo apt install cmake
安装,安装后的版本号为:3.22.1; - 安装git:系统中用
sudo apt install git
安装,安装后的版本号为:2.20.1; - 安装ninja:系统中用
sudo apt install ninja-build
安装,安装后的版本号为:1.8.2-1; - 编译安装最新版本的binutils(因系统自带的版本较低,使用ld/gold链接gcc/g++/llvm/clang/clang++的时候,会遇到错误)
(1)创建源码目录:cd /home/develop; mkdir src
(2)设置工作目录:cd /home/develop/src
(3)下载源码:wget https://ftp.gnu.org/gnu/binutils/binutils-2.43.1.tar.gz
(4)解压源码:tar -xzf binutils-2.43.1.tar.gz
(5)进入源码目录:cd binutils-2.43.1
(6)运行配置脚本:./configure --prefix=/home/develop/install/binutils-2.43.1/ --disable-werror --enable-gprofng=no
备注:使用--enable-gprofng=no
选项是因为gprofng的源码有编译错误。
(7)编译:make
(8)安装:make install
- 从源码编译安装python3的较新版本(3.13.0),因系统自带的版本(3.7.3)太低,无法编译llvm,所以必须升级
(1)设置工作目录:cd /home/develop/src
(2)下载源码:wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tar.xz
(3)解压源码:tar -xJf Python-3.13.0.tar.xz
(4)进入源码目录:cd Python-3.13.0
(5)运行配置脚本:./configure --prefix=/home/develop/install/Python-3.13.0/
(6)编译:make
(7)安装:make install
备注:make install 时会遇到错误,但不影响。 - 从源码编译安装gcc/g++ 的较新版本(14.2.0),因系统自带的版本太低,必须升级
(0)编译资源需求:4GB内存,磁盘空间:12GB
(1)设置工作目录:cd /home/develop/src
(2)下载源码:wget https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.gz
(3)解压源码:tar -xzf gcc-14.2.0.tar.gz
(4)下载gcc依赖的第三方库:进入gcc-14.2.0目录,然后下载依赖的第三方库
cd /home/develop/src/gcc-14.2.0
./contrib/download_prerequisites
(5)配置(说明:由于UOS自带的ld(v2.31.1)链接gcc/g++时失败,所以使用源码编译安装的最新版ld(v2.43.1)):
mkdir -p /home/develop/src/gcc-14.2.0.build
cd /home/develop/src/gcc-14.2.0.build
export LD="/home/develop/install/binutils-2.43.1/bin/ld"; ../gcc-14.2.0/configure --prefix=/home/develop/install/gcc-14.2.0 --disable-multilib --enable-ld --enable-bootstrap
注意:运行configure的过程中,如果遇到错误,请留意系统的安全拦截提示,按照安全拦截提示,允许任意程序执行即可。
(6)编译:make -j 12
多进程编译,编译参数可参考电脑实际有几个核心。
(7)安装:make install
(8)设置环境变量,以使新版gcc/g++可用(将下列内容放在/home/develop/source.sh文件中,便于使用:source /home/develop/source.sh
):
#!/bin/bash
# python3
export PATH=/home/develop/install/Python-3.13.0/bin/:$PATH
# binutils
export PATH=/home/develop/install/binutils-2.43.1/bin/:$PATH
# gcc/g++ 14.2
export PATH=/home/develop/install/gcc-14.2.0/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/gcc-14.2.0/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$CPLUS_INCLUDE_PATH
- 从源码编译安装llvm/clang/clang++的较新版本(19.1.3),因系统自带的版本太低,必须升级
(0)编译资源需求:16GB内存,
(1)设置工作目录:cd /home/develop/src
(2)下载源码:wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-19.1.3.tar.gz
(3)解压源码:tar -xzf llvmorg-19.1.3.tar.gz
(4)使用gcc/g++最新版:source /home/develop/source.sh
(5)生成编译配置:cmake -S ./llvm-project-llvmorg-19.1.3/llvm/ -B ./llvm-project-llvmorg-19.1.3.build -G Ninja -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/home/develop/install/gcc-14.2.0/bin/gcc -DCMAKE_CXX_COMPILER=/home/develop/install/gcc-14.2.0/bin/g++ -DCMAKE_INSTALL_PREFIX=/home/develop/install/LLVM-19.1.3
(6)编译源码:ninja -C ./llvm-project-llvmorg-19.1.3.build
(7)安装:ninja -C ./llvm-project-llvmorg-19.1.3.build install
(8)设置环境变量,以使新版llvm/clang/clang++可用(将下列内容放在/home/develop/source.sh文件中,便于使用:source /home/develop/source.sh
):
#!/bin/bash
# python3
export PATH=/home/develop/install/Python-3.13.0/bin/:$PATH
# binutils
export PATH=/home/develop/install/binutils-2.43.1/bin/:$PATH
# gcc/g++ 14.2
export PATH=/home/develop/install/gcc-14.2.0/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/gcc-14.2.0/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$CPLUS_INCLUDE_PATH
# llvm/clang/clang++
export PATH=/home/develop/install/LLVM-19.1.3/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/LLVM-19.1.3/lib/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$CPLUS_INCLUDE_PATH
- 从源码编译安装gn(没找到系统自带的,所以从源码编译):
(1)设置工作目录:cd /home/develop/src
(2)下载源码:git clone https://github.com/rhett-lee/gn.git
(3)进入源码目录:cd /home/develop/src/gn
(4)使用gcc/g++最新版:source /home/develop/source.sh
(5)生成编译配置:export CXX=g++; python3 build/gen.py
(6)编译源码:ninja -C out
(7)设置环境变量,以使gn可用(将下列内容放在/home/develop/source.sh文件中,便于使用:source /home/develop/source.sh
):
#!/bin/bash
# python3
export PATH=/home/develop/install/Python-3.13.0/bin/:$PATH
# binutils
export PATH=/home/develop/install/binutils-2.43.1/bin/:$PATH
# gcc/g++ 14.2
export PATH=/home/develop/install/gcc-14.2.0/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/gcc-14.2.0/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/gcc-14.2.0/include/c++/14.2.0/:/home/develop/install/gcc-14.2.0/include/c++/14.2.0/x86_64-pc-linux-gnu/:$CPLUS_INCLUDE_PATH
# llvm/clang/clang++
export PATH=/home/develop/install/LLVM-19.1.3/bin/:$PATH
export LD_LIBRARY_PATH=/home/develop/install/LLVM-19.1.3/lib/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/develop/install/LLVM-19.1.3/include/:$CPLUS_INCLUDE_PATH
# gn
export PATH=/home/develop/src/gn/out/:$PATH
- 安装libfontconfig开发库(Skia依赖该库):
sudo apt install libfontconfig1-dev
,安装后版本号为2.13.1.1-2+sign - 安装OpenGL:
sudo apt install libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev
- >
cd /home/develop
- >
git clone https://github.com/google/skia.git
- >
git checkout 8e83e49cba3a28671d07661d88bddc3e84ae132d
- 备注:skia源码更新的日期:
Date: 2025/2/8 1:12:45
- 更新修改代码:
- 下载需要更新的代码到本地:
git clone https://github.com/rhett-lee/skia_compile
- 更新文件:解压
Skia.2025-02-08.src.zip
,将解压后的文件,覆盖/home/develop/skia/目录中的所有同名文件。 - 注意事项:该修改的代码的SHA-1值,需要比对,如果不是这个版本的代码,直接覆盖可能有问题,需要手工修改;
- 修改代码解决的问题:修改部分其他源码:修复运行时的几个小问题。
- 进入skia源码目录:
>cd /home/develop/skia
- 使用clang/clang++最新版:
source /home/develop/source.sh
- 编译skia静态库(LLVM.x64.Release)
gn gen out/LLVM.x64.Release --args="target_cpu=\"x64\" cc=\"clang\" cxx=\"clang++\" clang_win_version=\"17\" 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\"]"
ninja -C out/LLVM.x64.Release
- 进入skia源码目录:
>cd /home/develop/skia
- 使用gcc/g++最新版:
source /home/develop/source.sh
- 编译skia静态库(LLVM.x64.Release)
gn gen out/LLVM.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 is_debug=false extra_cflags=[\"-DSK_DISABLE_LEGACY_PNG_WRITEBUFFER\"]"
ninja -C out/LLVM.x64.Release