android - 如何将 Stockfish 13 从 Windows 10 交叉编译到 armv8?
问题描述
Stockfish 13 于 2021 年 2 月 19 日发布,是我写这些行时最强大的国际象棋引擎。您可以为 windows、linux、mac os 和 android 下载它。然而,在我写这些行的时候,android二进制文件下载链接指向Stockfish 12而不是13。(Stockfish经常发生这种情况,因为android二进制文件不是人们最需要的。)因为Stockfish是开源的( github here),我们如何在 Windows 10 计算机上为 Android 手机交叉编译 Stockfish 13?(就我而言,是运行 Android 11 的三星 Galaxy S21 Ultra。)
解决方案
我们将需要源代码:(git clone https://github.com/official-stockfish/Stockfish.git
请参阅 Stockfish 的 github 上的正确地址,因为此地址可能会更改)在您 PC 的某个位置。(例如,您需要 Tortois Git 的命令行实用程序。)让我们调用PC 上StockFishDIr
StockFish 文件夹(包含src
子文件夹)的完整路径。
我们还需要一个交叉编译器来...将 PC 上的源代码交叉编译(!)为针对 Android 操作系统的可执行文件,这意味着:可以在 Android 操作系统(即手机)上执行。我们将使用包含工具链和交叉编译器的Android-NDK 。我们下载“最新稳定版”r22(在我写这些行的时候)并将其解压缩到 PC 上的文件夹中;我在 PC 上将“AndroidNdkDir”称为此目录(包含build
、meta
、prebuilt
等toolchains
文件夹)的完整路径。
最后,在 Stockfish 的源代码中只有一个 Makefile,我们将需要make
在 windows 下。是的。只需从GnuWin32获取它并记MakeDir
下您 PC 上的安装目录,该bin
目录包含包含make.exe
. 线性分析MakeFile
表明,如果下载了一些文件,交叉编译归结为只有一个命令行,以及另一个“优化”命令行。
现在我们看看MakeFile
from StockFishDIr\src
; 我们将对其稍作修改。
首先,我们通过更改行来更改可执行文件名称
EXE = stockfish
进入
EXE = stockfish_13_armv8_xcomp_win10x64
给它一个有意义的名字。
其次,我们定位了编译器的出现armv8
(它是ARCH
三星Galaxy S21 Ultra的;如果你有另一部Android手机,也许你应该寻找'armv7'并适应以下内容):即我们替换位
ifeq ($(arch),armv8)
CXX=aarch64-linux-android21-clang++
STRIP=aarch64-linux-android-strip
endif
和
ifeq ($(arch),armv8)
CXX=AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android30-clang++.cmd
STRIP=AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip.exe
endif
endif
(请注意,android21
我将 CXX 行中的首字母替换为android30
。这是因为三星 Galaxy s21 Ultra 运行的是 Android 11,其实际版本号为 android30。如果您的 android 手机具有另一个 android 版本,请相应地调整这些行。 )
现在,在编译之前,我们需要最后一个文件:网络文件(技术,网络 = 网络 = 神经网络 = Stockfish 使用的神经网络的权重文件)。“通常”(啊啊),在 linux 设置下(我在这里所做的所有工作几乎都在 Linux 上进行了必要的修改),我们只会"MakeDir\bin\make.exe" profile-build ARCH=x86-64
在需要的地方下载网络文件,我们甚至不会打扰它。可悲的是,在这里运行"MakeDir\bin\make.exe" profile-build ARCH=x86-64
由于某种原因不起作用,我们需要自己手动下载net文件。因此,我们必须在 Makefile 中查找 net 文件是如何下载的。Makefile 中重要的一点是:
# evaluation network (nnue)
net:
$(eval nnuenet := $(shell grep EvalFileDefaultName evaluate.h | grep define | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
@echo "Default net: $(nnuenet)"
$(eval nnuedownloadurl := https://tests.stockfishchess.org/api/nn/$(nnuenet))
$(eval curl_or_wget := $(shell if hash curl 2>/dev/null; then echo "curl -skL"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi))
@if test -f "$(nnuenet)"; then \
echo "Already available."; \
else \
if [ "x$(curl_or_wget)" = "x" ]; then \
echo "Automatic download failed: neither curl nor wget is installed. Install one of these tools or download the net manually"; exit 1; \
else \
echo "Downloading $(nnuedownloadurl)"; $(curl_or_wget) $(nnuedownloadurl) > $(nnuenet);\
fi; \
fi;
$(eval shasum_command := $(shell if hash shasum 2>/dev/null; then echo "shasum -a 256 "; elif hash sha256sum 2>/dev/null; then echo "sha256sum "; fi))
@if [ "x$(shasum_command)" != "x" ]; then \
if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
echo "Failed download or $(nnuenet) corrupted, please delete!"; exit 1; \
fi \
else \
echo "shasum / sha256sum not found, skipping net validation"; \
fi
我们看到文件的地址是https://tests.stockfishchess.org/api/nn/$(nnuenet))
,并且变量nnuenet
是通过在头文件(在里面)中grep
的字符串定义的,感兴趣的行是:EvalFileDefaultName
evaluate.h
StockFishDIr\src
#define EvalFileDefaultName "nn-62ef826d1a6d.nnue"
因此,变量nnuenet
等于字符串“nn-62ef826d1a6d.nnue”,我们要手动下载网络的地址是https://tests.stockfishchess.org/api/nn/nn-62ef826d1a6d.nnue。
当然,这个地址将来可能会改变,但你看这个想法。现在我们把net文件放在里面StockFishDIr\src
现在我们准备好交叉编译,在里面执行以下命令StockFishDIr\src
:
"MakeDir\bin\make.exe" stockfish_13_armv8_xcomp_win10x64 COMP=ndk COMPCC="AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android30-clang --target=aarch64-linux-android30" ARCH=armv8
(这里也aarch64-linux-android30
根据您的 Android 手机调整这些位。)
当前面的命令正确执行时,它会在文件夹中生成stockfish_13_armv8_xcomp_win10x64
二进制StockFishDIr\src
文件。这个二进制文件已经可以在您的手机上使用(例如,通过将其放在DroidFish\uci
您的 DroidFish 应用程序的文件夹中),但不是最佳的,因为它的大小很大并且执行速度有点慢。因此,我们必须使用以下命令行“剥离”二进制文件,仍在StockFishDIr\src
文件夹内:
“AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip”stockfish_13_armv8_xcomp_win10x64
(android30
不再有,但仍然有:根据您的 Android 手机aarch64
调整此处的位。)aarch64-linux-android30
现在,您的二进制文件stockfish_13_armv8_xcomp_win10x64
完全可用。您可以在手机上与 StockFish 13 下棋,然后受苦!;)
推荐阅读
- java - Hibernate Validator 和 apache bval - 要加载哪个验证器?
- angular - 为什么 pipe(take(1) 没有完成 RxJS 流
- c++ - 移动仅包含可移动 std::map 的类的构造函数不起作用
- vue.js - 如何卸载 VUE 4.1.2
- python-3.x - I want to convert a dictionary to pandas dataFrame
- javascript - 如何将图像转换为缓冲区
- python - numpy where 有不同的大小
- javascript - 多个过滤器javascript
- python - 计算列表项并存储在与列表项对应的数据框列中
- node.js - 满足条件时,Node.js 开关/案例不中断