上课摸鱼,想到上周四浪费了一下午折腾思源笔记的交叉编译,就想着来说一下。如今库已经被我删掉了,也没有代码佐证,只能凭记忆瞎说,还请包涵。
先说动机。我目前手上有一块 Windows on ARM 的板子(具体型号为 Xiaomi Book 12.4 2023),平时主要作为 RDP 终端使用,但也运行浏览器或者 QQ 这样的 light load。考虑到自己买这个板子的一大动机是 随时写作,很自然而然地想到了思源笔记。思源笔记是一个前后端分离的软件,前端是几乎仅作为浏览器使用的 Electron,后端是 Go。二者 按理来说 都是对交叉编译特别友好的。再加上之前也有一个 issue 没有解决。想到这里,那还犹豫什么呢,直接 fork 开干不就得了?
脸被打得很疼。
思源笔记的后端虽然是 Go,但是是 CGO_ENABLED Go。CGO 要求使用一个非 MSVC 编译器来编译源码中的的 C 代码部分。于是很自然地就想到了 MSYS2 MinGW。但是……
奇异搞笑的是,gcc 在 Windows on ARM 上完全没有出现过。用 GCC Windows ARM 作为关键词检索,只能找到 Windows 上编译到 Linux ARM 的交叉编译。我找了无数家编译器发行版,tdm、Winlibs、MSYS2,都没有。
因此只能换用隔壁“不那么原教旨”的 Clang 了。他们至少提供交叉编译器。
当然这个交叉编译器也不是一个二进制文件,是一个指向 MSYS Clang 的 shell file,是无法被 CGO 调用的。那也只能把里面的命令 cat 出来,然后塞进 CC_FOR_windows_arm64 环境变量里。
(↑ 从聊天记录翻出来的)
好了,按理来说可以编译了吧?
炸的不明不白。看样子还是依赖于 gcc 的样子。 Update: 疑似是因为我没有安装 mingw-w64-cross-clang-headers,有空再试试罢。
中间省略了很多细节,但是总之,最后的最后,还是不明不白地失败了。
稍微查看了一下一些 Windows on ARM with CGO 的实践,有说可以采用 Zig 作为交叉编译工具链的,日后可以再试试,现在是真的懒了。
最好的办法,其实还是希望思源能够减少直至抛弃代码库中的 CGO 依赖。这样对整个代码库的 Portability 也有提升。
那讲都讲这么多了,再讲一个探索过程中的问题,关于思源笔记目前的 Actions Workflow 的一个问题:
第一,这个 MinGW 没有实际作用。MSYS 环境是相对 Windows PATH 独立的。只有 显式声明使用 的时候才会被使用。至于为什么能够编译,那是因为 GitHub Action 的镜像 自带 了 GCC。
第二,打错字了,MingGW -> MinGW。
睡觉。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于