2311skia,本地惊心动魄的编译skia的x86版本

news/2024/2/29 15:33:08 标签: skia

首先,感谢steampp,这样可以随时访问github.不然,根本干不了活.

skia_3">第一步,学习并下载skia

正确编译skia,有人家的辛苦工作
借用github action编译skia方法
本地编译的1个教程
对我来说,这一步是完成不了的:

cd skia
python2 tools/git-sync-deps
//或者加上.exe变成
python2.exe tools/git-sync-deps

主要是py2的代码太难改.
这里是用py2下载依赖的方式
github的action编译

xmake的skia
能够访问github,就可借用xmake帮助编译skia.但我没试过.

窗口编译skia
谷哥的depot_tools位置
可借用gitee下载depot_tools/skia,
谷哥的skia位置

python2 tools/git-sync-deps

这一步自动下载skia依赖的三方库,会自动下载到skia/third_party/externals目录;以及用于生成项目文件的工具gn.exe.注意:externals存放依赖位置.而third_party下面一堆目录是相应的Build.gn存放位置.

简单介绍gn

gn.exe既要放在路径中,也要放在H:\cpp\skia\bin\目录中,还有编译的时候,不能仅用gn,而是要输入gn.exe全名.
depot_toolsskia的镜像,可用gitee帮助.

skia_37">第二步,下载skia的依赖

skia依赖的第三方库,是最麻烦的.只有下载正确的依赖库,才能大大减轻编译skia的麻烦.因为不能正确使用python2.exe,所以不能像别人直接调用py2就可下载正确的依赖包.
skia/DEPS,最新的依赖包,有许多新依赖.
而文章中的依赖,有部分过时了.
即,先用前面文章中的DEPS复制替换到你的DEPS中,但要记得备份原DEPS.
这是原待下载路径:

https://github.com/GoogleDepends/EGL-Registry
https://github.com/GoogleDepends/OpenCL-Registry
https://github.com/GoogleDepends/OpenGL-Registry
https://github.com/GoogleDepends/SPIRV-Cross
https://github.com/GoogleDepends/SPIRV-Headers
https://github.com/GoogleDepends/SPIRV-Tools
https://github.com/GoogleDepends/angle2
https://github.com/GoogleDepends/buildtools
https://github.com/GoogleDepends/common
https://github.com/GoogleDepends/common-lib-amd-APPSDK-3.0
https://github.com/GoogleDepends/dawn
https://github.com/GoogleDepends/dng_sdk
https://github.com/GoogleDepends/expat
https://github.com/GoogleDepends/freetype2
https://github.com/GoogleDepends/glslang
https://github.com/GoogleDepends/harfbuzz
https://github.com/GoogleDepends/icu
https://github.com/GoogleDepends/imgui
https://github.com/GoogleDepends/jinja2
https://github.com/GoogleDepends/libgifcodec
https://github.com/GoogleDepends/libjpeg-turbo
https://github.com/GoogleDepends/libmicrohttpd
https://github.com/GoogleDepends/libpng
https://github.com/GoogleDepends/libwebp
https://github.com/GoogleDepends/lua
https://github.com/GoogleDepends/markupsafe
https://github.com/GoogleDepends/piex
https://github.com/GoogleDepends/sdl
https://github.com/GoogleDepends/sfntly
https://github.com/GoogleDepends/shaderc
https://github.com/GoogleDepends/swiftshader
https://github.com/GoogleDepends/wuffs
https://github.com/GoogleDepends/zlib

这里面,有几个需要是最新的,因为它的路径里面是旧版(2020年).

gn.exe,是从官网下载的win32版.前面说了,要放在两个地方,不然后面编译会出问题,而且输入命令时,要用gn.exe,而不光是gn(要出错).人家提醒要放进skia\bin了,但我没看见,后来才试错加进去.

第三步,写配置

下载完依赖后有三步动作:
1,改gn配置,然后用gn.exe gen out\Static生成ninja文件.
2,修改skia\out\Static\toolchain.ninja文件.
3,执行ninja -C out/Static编译命令,
因为toolchain.ninja有点小问题,每次更改配置后,都是这三步.

改配置,生成ninja文件

最新的DEPS有点大,我编译时,是用前面文章的替换了,还没下载有些最新依赖.
我是生成x86版的静态库.其他的可以类似.

gn.exe gen out/Static
//这样,在out/Static目录里面输出ninja文件.

这里ninja用的是,depot_tools里面的ninja.exe.

进入out/Static目录,在args.gn文件里面写入:

clang_win = "G:\LLVM"
//最新的LLVM为17版本,下载到此地
target_cpu = "x86"
//x86目标.
extra_cflags=["/MT"]
//静态库
win_vc = "C:\vs2022\VC"
//这是vs2022安装目录

然后是修改gn\BUILDCONFIG.gn文件,最上面空的,改为类似:

  cc = "clang"
  cxx = "clang++"
//cc与cxx工具.
  win_sdk = "C:\WindowsKits\10"
//一般正常中间有个空格为Windows Kits.
//这里临时去掉空格,等编译完再加上空格
  win_sdk_version = "10.0.22621.0"
//sdk版本
  win_vc = "C:\vs2022\VC"
//VC目录
  win_toolchain_version = "14.37.32822"
//VC版本,根据自身填写.

  clang_win = "G:\LLVM"
//用LLVM编译,skia更小,编译更快
  clang_win_version = "17"
//最新的为17版本,15版本,就要重新下载,

然后,就可执行如下命令了:

gn.exe gen out\Static

添加--ide="vs2017"--ide=vs,会生成sln,但我用sln编译不了,别人也不推荐这种方法.

改工具链生成文件.

主要是两个动作:
1,删掉类似下面这样的6句:

cmd /c C:/WindowsKits/10/bin/SetEnv.cmd /x86 &&

2,把微软的python3改为python.exe,因为python3下面并不存在什么东西,即不管用.要用python.exe,才能真正执行命令,当然python.exe要在路径上.

执行真正的编译

ninja -C out/static

然后,就开始编译了.

手动修改编译过程中问题

前面说了,上面的有些库过时了,不能用它,这些库有:harfbuzz/libexpat/libwebp/wuffs/libmicrohttpd/imgui/libjpeg-turbo,从各自的官网重新下载这些库进externals目录
各自官网如下:

https://github.com/libjpeg-turbo/libjpeg-turbo
//https://github.com/amusi/libjpeg-turbo-examples
//示例.libjpeg-turbo主要是比libjpeg快一些.
https://github.com/harfbuzz/harfbuzz
https://github.com/Karlson2k/libmicrohttpd
https://github.com/ocornut/imgui
https://github.com/webmproject/libwebp
https://github.com/libexpat/libexpat
https://github.com/google/wuffs

把上面的库下载到externals目录里面,最新的依赖更多,不过我不知道了,你也许可以试试单独官网下载,再编译.

turbo版的示例
编译时,出现:

build stopped: subcommand failed.

ninja是按一系列命令来构建,出现这个,代表该命令有问题,你要解决它.
简单介绍ninja,ninja官网

解决编译问题

1,没有gsubgpos-context.cc文件,从这里下载.

2,找不到jpeg_nbits_table.c,网上搜索,内容与jpeg_nbits_table.h差不多,其实只需要如下就行了.

#include "jpeg_nbits_table.h"

3,出现bin/SetEnv.cmd问题,就是前面没有删除toolchain的问题,因为根本就不应该有个SetEnv.cmd文件,有也算过时了.

4,这里前面的几个错误,及修改可能搞忘记了.开始未用笔记记着,所以,如果你遇见了,要靠自己解决了,应该能够搞定了,不是很难.

5,find_headers.py问题:

//find_headers.py
  print(gn_desc_cmd)//得知,要用`gn.exe`
  desc_json_txt = subprocess.check_output(gn_desc_cmd).decode('utf-8')

如下修改:

gn\toolchain\BUILD.gn,45行附近
dlsymutil_pool_depth = 8
//设置为8,

6,icudtl.dat复制问题,还是py的问题

icudtl.dat,cp.py==>

这是toolchain.ninja问题,把python3改成python.exe.

7,xmlparse.c问题,在前面加上一句:
xmlparse.c前面加上:

#include "expat_config.h"
#define XML_GE 1
//上面这一句.

8,py2版本问题,py3运行py2:
make_data_assembly.py,79行要改为:

split = [str(binascii.hexlify(input_data[i:i + 4][::step]),'ascii').upper().lstrip('0') for i in range(0, len(input_data), 4)]

9,imguilayer.h,imgui的兼容问题

    float availWidth = std::max(ImGui::GetContentRegionAvail().x, 1.0f);

把,Width改为如上的Avail().x.

10,Viewer.cpp,2589行:

if (fShowSlidePicker) {
    ImGui::SetNextTreeNodeOpen(true);//改为下面.
    ImGui::SetNextItemOpen(true);
}

同样是兼容问题.

11,compression_utils_portable.cc错误导入路径问题

#include "third_party/zlib/google/compression_utils_portable.h"
#include "compression_utils_portable.h"
|| ../../third_party/externals/zlib/google/compression_utils_portable.h(15,10): fatal error: 'third_party/zlib/zlib.h' file not found
#include "third_party/zlib/zlib.h",改为
#include "../zlib.h"
//把导入都改为类似,"../zlib.h"

12,不能生成:skia.h.这是最早的工具链问题,
toolchain.ninja里面.
user\...\python3改成python.exe.就是py的路径问题.

13,GetColorPalette找不着,libwebp中的build.gn中加上下面这句,主要可能是搞忘记了.

  "../externals/libwebp/src/utils/palette.c",
//加上上面这一行.
  "../externals/libwebp/src/utils/utils.c",
//这是最后一行

然后,再来一次流程:

gn.exe gen out/Static
改工具链的错误.
ninja -C out/static

14,再试试:
libwebp.ninjautil.c上方加上:

build obj/third_party/externals/libwebp/src/utils/libwebp.palette.obj: cc ../../third_party/externals/libwebp/src/utils/palette.c
  source_file_part = palette.c
  source_name_part = palette

15,LLVM,要下载最新的17版本.
16,libjpeg-turbo,jconfig.h,直接从jconfig.vc复制.

看看,编译skia,真是惊心动魄啊!


http://www.niftyadmin.cn/n/5229004.html

相关文章

10-微信小程序 图片 相机 二维码 动画相关API(实现选择相册、拍照、录像、动画)

10-微信小程序 图片 相机 二维码 动画相关API(实现选择相册、拍照、录像、动画) 文章目录 10.1选择图片wx.chooseImage(Object object)object.success 回调函数代码效果 10.2 预览图片wx.previewImage(Object object)代码效果 10.3 相机APICameraContext wx.createCameraContex…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别,有时候需要查看 WARN 级别的日志,所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

SSH基础和高级用法

SSH基础和高级用法 SSH(Secure Shell)是一种安全协议,用于在不安全的网络上提供安全的远程登录和数据传输。以下是一些SSH的用法和高级用法: 基本用法: 远程登录:使用ssh命令可以实现在本地计算机上远程…

MatchPyramid实现文本匹配

引言 今天利用MatchPyramid实现文本匹配。 原论文解析→点此←。 MatchPyramid 核心思想是计算两段文本间的匹配矩阵,把它当成一个图形利用多层卷积网络提取不同层级的交互模式。 匹配矩阵是通过计算两段输入文本基本单元(比如字或词)之间相似度得到的&#xf…

spring-boot-admin-starter-server监控springboot项目

文章目录 场景实现具体操作展示 场景 监控三件套Prometheus、Grafana、Alertmanager 部署起来太复杂,如果公司没有运维而且项目很小就可以使用spring-boot-admin-starter-server替代。这个包使用起来还是很简单的, 下面就实现一个对springCloud项目的监控 实现 参考 项目 具体操…

vuepress-----4、侧边栏

# 4、侧边栏 # 自动生成侧栏 如果你希望自动生成一个仅仅包含了当前页面标题(headers)链接的侧边栏,你可以通过 YAML front matter 来实现: --- sidebar: auto ---你也可以通过配置来在所有页面中启用它: // .vuep…

C //习题 9.8 写一个函数insert,用来向一个动态链表插入结点。

C程序设计 (第四版) 谭浩强 习题9.8 习题 9.8 写一个函数insert,用来向一个动态链表插入结点。 IDE工具:VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块: 由于链表是动态链表,不能按照结构体变量为数组的…

如何使用内网穿透实现无公网ip环境访问VScode远程开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

超详细!Opencv人脸识别!附源码!

一、新建环境 注意!!确定后需要关闭项目,重新打开,终端的环境才会变化!! 二、下载安装包(只需要3个即可) 1. 下载dlib包 pip install dlib-19.19.0-cp38-cp38-win_amd64.whl.whl …

【电源专题】DC/DC电源FB分压电阻设计注意事项

在DC/DC电源中我们不可避免的会遇到FB分压电阻的取值,PCB设计等问题。如下所示随意打开一份同步降压稳压器规格书TPS56320X,规格书中的简化电路原理图就已经存在VFB管脚上的两个分压电阻。 很多工程师朋友们会误认为分压电阻只是简单的将输出电压缩小到参考电压,通过此电压来…

SS8812T 36V/1.6A 两通道 H 桥驱动芯片 替代DRV8812

SS8812T 为打印机和其它电机一体化应用提 供一种双通道集成电机驱动方案。 SS8812T 有两 路 H 桥驱动,每个 H 桥可提供最大输出电流 1.6A (在 24V 和 Ta 25C 适当散热条件下),可驱动两 个刷式直流电机,或者一个双极步进电机&#xff0…

Java开发规范(简洁明了)

本篇规范基于阿里巴巴开发手册,总结了一些主要的开发规范,希望对大家有帮助。 目录 1. 命名规范: 2. 缩进和空格: 3. 花括号: 4. 注释: 5. 空行: 6. 导入语句: 7. 异常处理&a…

Windows Terminal CMD 终端配置方案: 不只是酷炫外观

大一的时候小学期我们还是用 Windows cmd 终端写的订餐系统,尽管进我们所能地改了改配色,成品还是让人不忍直视。 当时学习遇到的大多数运行需求可以通过 IDE 解决,再加上 CMD 丑成这样,挺让人抵触的。 后来对命令行操作的学习需…

CentOS7.5搭建Hadoop-3.3.6集群的详细操作流程-实操版本

一、准备工作 1、安装 VMware,已安装的,跳过此步骤即可 官方正版VMware下载(16 pro):https://www.aliyundrive.com/s/wF66w8kW9ac 安装:选一下安装地址,一直下一步即可。(可能会要…

react-flip-move结合array-move实现前端列表置顶效果

你有没有遇到这样的需求?点击左侧列表项,则像聊天会话窗口一样将被点击的列表项置顶。 如果只是单纯的置顶的话,直接使用array-move就可以实现了,但置顶效果多少有点突兀~ 先上代码,直接使用array-move的情况&#xf…

Transformer代码实例中各张量的维度是多少

一下是一个Transformer代码实例: def sample(self, batch_size, max_length140, con_token_list [is_JNK3, is_GSK3, high_QED, good_SA]):"""Sample a batch of sequencesArgs:batch_size : Number of sequences to samplemax_length: Maximum le…
最新文章