mac/macos上编译electron源码

官方教程:Build Instructions | Electron

准备工作这里不写了,参考官方文档,还有上一篇windows编译electron electron源码下载及编译-CSDN博客

差不多步骤,直接来

网络记得使用魔法

下载编译步骤

  1. 选择目录很重要,请看错误集锦2, 4

  2. mkdir electron_src && cd electron_src

  3. gclient config --name "src/electron" --unmanaged https://github.com/electron/electron@v18.3.5

  4. gclient sync --with_branch_heads --with_tags 失败继续来

  5. cd src

  6. export CHROMIUM_BUILDTOOLS_PATH=`pwd`/buildtools

  7. export PATH="/xxx/src/third_party/depot_tools:$PATH" 或者添加到 ~/.bash_profile source ~/.bash_profile

  8. 编译时需要选择好macos sdk版本,我的电脑xcode版本较高,只能自己另外下载macos sdk版本

  9. gn gen out/Release --args="import(\"//electron/build/args/release.gn\")"

  10. ninja -C out/Release electron

  11. ninja -C out/Release electron:electron_dist_zip

就这么简单就下载编译好了,是不是很容易

错误集锦

gclient sync --with_branch_heads --with_tags 过程中EOF错误

0:02:33 error: 4049 bytes of body are still expected

0:02:33 fetch-pack: unexpected disconnect while reading sideband packet

0:02:33 fatal: early EOF

0:02:33 fatal: fetch-pack: invalid index-pack output

subprocess2.CalledProcessError: Command 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://github.com/nodejs/node.git /Users/electron_src/src/third_party/_gclient_electron_node_nmge4lep' returned non-zero exit status 128 in /Users/electron_src

0:02:37 _____ Conflicting directory found in /Users/electron_src/src/third_party/electron_node. Moving to /Users/electron_src/_bad_scm/src/third_party/electron_node3_rt8q61.

主要原因是mac笔记本性能差,electron_node这个第三方库下载git缓存不够,导致总是失败,这个说法我也不确定是否准确,有不对的欢迎指正。

解决办法:

  • git config --global core.compression 0 //不确定这个是否有效
  • depot_tools/gclient_utils.py 去掉 -c core.deltaBaseCacheLimit=2g

其他尝试但是失败的方式

  1. -c core.deltaBaseCacheLimit=2g 2g改大改小 都不行

  2. git config --global core.compression 9 //当时还有混合其他配置,反正是失败了 git config --global core.compression -1

  3. ulimit -n unlimited ulimit -f unlimited

  4. git config --global pack.window

  5. git config --global http.postBuffer 157286400 //这个没有试

  6. git config --global http.lowSpeedLimit 0 git config --global http.lowSpeedTime 999999 单位 秒

  7. git config --global core.packedGitLimit = 512m 2g 8g都不行

  8. git config --global core.packedGitWindowSize = 同上

  9. git config --global pack.packSizeLimit = 同上,设置各种值

  10. git config --global pack.

  11. --depth 1 //这个选项因为是electron集体下载,无法单独设置

2. 下载好的electron源码路径在mac上不太对,导致很多文件没有权限

我下载到/Users/自定义的一个目录/,结果权限各种问题,建议下载到/Users/用户/ 目录下

gn gen out/Release --args="import(\"//electron/build/args/release.gn\")"

解决办法:

sudo chmod -R a+rw src

后面还有其他权限问题,其实,可以最开始 sudo chown -R $(whoami) src

3. 编译阶段报错 ../../third_party/angle/src/common/angle_version_info.cpp:14:5: error: non-void function 'GetANGLERevision' should return a value -Wreturn-type

解决方法:

以下方法修改源码,可以临时不报这个错误,根本解决问题需要选对macos sdk版本

third_party/angle/src/commit_id.py脚本未知原因,生成的out/Release/gen/angle/angle_commit.h中 #define ANGLE_COMMIT_POSTION xxx这里是空

python commit_id.py position 实际版本结果为17992 ,先简单直接把angle_commit.h中的 版本改为17992

类似问题,但是解决方式 ??? CEF Forum • 5790 compilation fails on windows due to ANGLE lib

4. Permission denied : third_party/node/mac/node-darwin-x64/bin/node

**解决方法:**sudo chmod -R a+rw third_party

5. protobuf error: 'sprintf' is deprecated

解决方法:

https://github.com/dart-lang/sdk/issues/52407

gn中添加 --no-deprecated-declarations protobuf/BUILD.gn

或者同步更新代码?

6.macos sdk版本要选择对,因为我的是electron18.3.5 所以最后选择的是macos sdk 11.3 ,不然很多莫名编译错误

解决方法:

下载对应的macos sdk,然后制定electron编译时使用

添加对Mac OS X 11.3的SDK的支持

在src/electron/build/args/all.gn中添加mac_sdk_path = "$path_to_MacOSX11.3_sdk_folder"

SDK可以在https://github.com/phracker/MacOSX-SDKs/tree/master/MacOSX10.14.sdk此处下载

趟坑过程

最开始使用xcode默认的sdk编译,我的xcode已经是12.x了,然后报错,

third_party/dawn/src/dawn/native/metal/DeviceMTL.h:146 error: unknown type name 'MTLTimestamp'; did you mean 'CVTimestamp'?

查看文章

https://www.cnblogs.com/bloglearning/p/12951559.html,建议使用mac sdk10.14

选择的mac sdk 10.14, 还是错误的,使用mac sdk 10.15也是错误

切换10.14和10.15,也遇到问题,最开始使用的10.14. gn生成out/Release以后,切换了10.15,此时没有清空out/Release, gn直接生成,结果好多个错误,解决不了,最后查到mac_sdk_min就是10.15,然后清空out/Release,gn生成,再编译就没有莫名错误了,包括楼上3的那个错误,但是又有了新的错误unknown type name 'MTLTimestamp'; did you mean 'CVTimestamp'?

https://www.cnblogs.com/bloglearning/p/12951559.html

https://www.ccppcoding.com/archives/350648

然后使用以下步骤查看这个electron源码要求的mac_sdk_min

$ gn args out/Release --list --short|grep sdk

cros_sdk_version = ""

mac_sdk_min = "10.15"

mac_sdk_name = "macosx"

mac_sdk_official_version = "12.1" //此项的意思,应该是当时使用的官方的sdk 12.1

mac_sdk_path = "/User/用户名/project/MacOSX10.15.sdk" // 自己设置的

查到的结果,既然要求mac_sdk_min是10.15,那为啥还报错MTLTimestamp未定义呢,搞不懂

mac_sdk_official_version既然写了12.1,https://github.com/phracker/MacOSX-SDKs/tree/master/MacOSX10.14.sdk 这个地址又只能下载到最大11.3的版本,那么使用11.3试一下吧

all.gn中mac_sdk_path改为新下载的11.3,清空,out目录,从小gn ,编译,完美,不报错了,直接编译过了,编译过程耗时1天

黄牛拉车,太慢了,笔记本性能不足啊

总结:这个错误 third_party/dawn/src/dawn/native/metal/DeviceMTL.h:146 error: unknown type name 'MTLTimestamp'; did you mean 'CVTimestamp'?

解决方法:

MTLTimestamp定义在macos sdk中的 metal.framework中,但是下载的10.15中,metal.framework中根本没有MTLTimestamp的定义

重新下载11.3才找到MTLTimestamp的定义,要求的mac_sdk_min = "10.15"根本就是错误的

https://github.com/phracker/MacOSX-SDKs/tree/master/MacOSX11.3.sdk

7. permission denied: third_party/node/mac/node-darwin-x64/bin/node

sudo chown -R $(whoami) third_party

如果还不行 则需要chmod -R a+rw ..xxx/xxx/node chmod a+rwx ..xxx/xxx/node

后面还有其他权限问题,其实,可以最开始可以 sudo chown -R $(whoami) src

做rtc开发,可以选择百家云brtc sdk

百家云brtc sdk支持全平台,当然也支持electron, electron sdk中的webrtc已经针对性地做了优化,有兴趣的可以查看百家云brtc sdk

百家云-开发文档

相关推荐
小七在进步11 小时前
string的使用(1)
c++·visual studio
白杨尚青12 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
kloc15 小时前
聊天室项目入口网关子服务的实现
linux·c++
csdn_aspnet18 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
小七在进步19 小时前
string的使用(2)
c++
青少儿编程课堂20 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack21 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
北城笑笑1 天前
Vue 109 ,从零搭建 Vue3 + Electron 工程:生态、安全桥接与打包选型( Vue + Electron )
前端·javascript·vue.js·安全·electron·vue
青少儿编程课堂1 天前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
草莓熊Lotso1 天前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试