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

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

第一步,学习并下载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的依赖

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.pyprint(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.csource_file_part = palette.csource_name_part = palette

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一练2023.11.30——验证身份【PTA】

题目链接 :验证身份 题目要求: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5&a…

windows文件删除权限

一、普通文件 这里指的是所有可以被随意删除的文件。 二、可更改权限的文件 如果想要删除的文件无法被删除,那大概是权限不够,这时候:鼠标右键、属性、安全、编辑、选择相应的组或用户(如果不知道哪个可以全选,反正…

Typescript学习笔记: 类型限定、流程语句的细节、面向对象思想(封装、继承、多态)抽象类方法、接口和实现类、枚举等示例

作为JavaScript的超集Typescript非常值得大家学习的。 类型限定、流程语句的细节、面向对象思想(封装、继承、多态)抽象类方法、接口和实现类、枚举等 主要的是面向对象编程思想 下面是Typescript学习笔记: Typescript学习笔记&#xff1…

麒麟操作系统进入单用户模式

Kylin V4 桌面版: 启动系统后,在启动菜单界面选择 Kylin 4.0.2 高级选项后回车。 在高级模式选项下选择第二行 recovery mode 模式后,按 e 编辑。 按 e 后如下图,找到 linux 开头的一行,修改 ro 为 rw 后&#xff0c…

[c语言c++]手写你自己的swap交换函数

函数传参有按值传递,指针传递,引用传递,分别看一下三种情况下的交换函数如何书写,应该使用哪种最方便。 当书写一个交换两个值的 swap 函数时,我们可以分别使用按值传参、指针传参和引用传参的方式来实现。下面是示例和…

北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter_24.v 1.2 divid…

linux系统下的nginx服务安装

一. 环境 在安装nginx前,需要提前配置的环境包括 pcre:rewrite正则相关pcre:URL重写软件,实现伪静态\URL跳转等、SEO优化。 openssl:https加密访问用它 zlib:提供数据压缩用1.安装pcre 1.1 检查版本 执行&#xff…

Selenium——isDisplayed()、isEnabled()、isSelected()

判断页面是否存在某元素 Selenium没有直接提供判断是否存在的方法,可以使用findElements返回的数量判断;或者判断findElement是否抛出异常 webDriver.findElements(By.xpath("(//div[classel-button-group]//button)[1]")).size()isDisplaye…

@Transactional注解失效的几个场景

一、Transactional注解作用在修饰符为非public的方法,Transactional注解不起作用。 Service public class ComeServiceImpl implements ComeService {AutowiredUserMapper userMapper;OverrideTransactionalint saveUser() {User user new User("qitian"…

window10家庭版中文转专业版流程

1.确认当前为家庭中文版 2.用管理员权限打开cmd窗口 3.输入 dism /online /get-targeteditions ,查询当前支持的升级的版本 4.专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T 5.changepk.exe /productkey VK7JG-NPHTM-C97JM-9MPGT-3V66T

C#,《小白学程序》第二十三课:大数的除法(BigInteger Divide)

1 文本格式 /// <summary> /// 比较a&#xff0c;b的大小&#xff0c;返回1&#xff0c;0&#xff0c;-1 /// 数据从低位&#xff08;右&#xff09;往高位&#xff08;左&#xff09;存储; /// </summary> /// <param name"a"></param> ///…

【Qt绘图】之绘制坦克

使用绘图事件&#xff0c;绘制坦克。 效果 效果很逼真&#xff0c;想象力&#xff0c;有没有。 示例 代码像诗一样优雅&#xff0c;有没有。 包含头文件 #include <QApplication> #include <QWidget> #include <QPainter>绘制坦克类 class TankWidge…

【12】Python函数专题(下)

文章目录 1. 高阶函数1.1 以函数为参数1.2 以函数为返回值1.3 以函数为 参数和返回值2. 闭包3. 装饰器3.1 装饰器的引入3.2. 装饰器的使用3.3 装饰器强化练习🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

设计模式详解(三):工厂方法

目录导航 抽象工厂及其作用工厂方法的好处工厂方法的实现关系图实现步骤 工厂方法的适用场景工厂方法举例 抽象工厂及其作用 工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里&#xff0c;我们通过对象间的相互协作&…

模拟算法【2】

文章目录 &#x1f958;6. N 字形变换&#x1f372;题目&#x1fad5;算法原理&#x1f963;代码实现 &#x1f957;38. 外观数列&#x1f37f;题目&#x1f9c2;算法原理&#x1f9c8;代码实现 &#x1f958;6. N 字形变换 &#x1f372;题目 题目链接&#xff1a;6. N 字形变…

《对话品牌》——诚信铸就品质 创新引领未来

本期节目《对话品牌》栏目组邀请到了东莞市星韵科技有限公司董事长吕玮先生参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;吕玮 节目主持人&#xff1a;杨楠 节目播出平台&#xff1a;中央新影…

TSINGSEE青犀AI视频智能分析系统的视频接入能力解析

视频智能分析技术是一种先进的人工智能技术&#xff0c;它能够对视频内容进行自动化的分析和理解。这种技术的主要特点包括实时性、自动化、准确性、可解释性等。 1&#xff09;实时性。视频智能分析技术能够在短时间内对大量的视频数据进行快速处理和分析&#xff0c;从而提供…

【笔记】Smali语法

Smali语法 Smali 是一种汇编语言&#xff0c;通常用于 Android 应用程序的反汇编和修改。Smali 代码是 Dalvik 虚拟机指令的文本表示形式。以下是一些常见的 Smali 语法元素&#xff1a; 1. 基本结构: Smali 文件是文本文件&#xff0c;通常以 .smali 扩展名结尾。每个 Smali…

centos7 pgrouting351

安装插件 yum -y install perl(version) perl-Data-Dumper [rootlocalhost build]# perl -vThis is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi (with 44 registered patches, see perl -V for more detail) 源码编译 wget https:/…

焕发图片生机,批量升级gif图片像素,打造高质量图片盛宴!

你是否曾经遇到过需要提高gif图片质量&#xff0c;但手动处理每一张图片又非常耗时且繁琐的情况&#xff1f;如果你觉得处理大量图片会让你感到压力&#xff0c;那么你一定需要我们的批量提高像素工具&#xff01; 第一步&#xff0c;首先我们要进入首助剪辑高手主页面&#x…