Linux 构建与发布

在 Linux 上构建 ShogiBoardQ,并以包含 AppImage 的 ZIP 在 GitHub 上发布

Linux Qt 6 AppImage GitHub Releases

本文介绍如何在 Linux 上构建 ShogiBoardQ,制作 ShogiBoardQ-linux.zip 并在 GitHub Releases 上发布。ZIP 中包含 AppImage(应用程序本体)、3・5・7・9・11・13 手诘的诘棋题集(各 1,000 题,共 6,000 题),以及用于普通对局的 USI 引擎 Hayanagi。发布时 Linux 只附加这一个 ZIP。

目前只能在 Arch Linux 上制作发布包。 AppImage 中随附的库的许可文档要通过 pacman 收集,因此使用 Arch Linux 的 Qt 软件包制作。用于发布的发布包在较旧的 Arch Linux 容器中制作(5.1)。应用程序本身的构建和开发也可以在其他发行版上进行。

目录

  1. 前提条件
  2. 搭建开发环境
  3. 获取源代码并构建
  4. 准备 Qt 的许可文档
  5. 制作 AppImage 与 ZIP
  6. 在 GitHub Releases 上发布
  7. 故障排除

1. 前提条件

项目要求
操作系统x86_64 的 Linux。制作发布包(AppImage 与 ZIP)需要 Arch Linux(用于发布时为 Docker 容器中的 Arch Linux)
编译器支持 C++17 的 GCC 9 及以上,或 Clang 10 及以上
CMake3.16 及以上(推荐 Ninja)
Qt6.7 及以上(Widgets、Charts、Network、Concurrent、Multimedia、Sql、LinguistTools)。制作发布包还需要 SVG 插件
PythonPython 3(发布用脚本)
Docker在容器中制作用于发布的发布包时
其他Git、curl、file、FUSE 2(运行 AppImage 格式的工具)、ImageMagick(缩小超过 512px 的图标)

制作发布包时需要联网,因为首次会下载 linuxdeploy 和 appimagetool。

关于 glibc: AppImage 只能在 glibc 与构建环境相同或更新的系统上运行。在最新的 Arch Linux 上构建时,需要 glibc 2.43 及以上,无法在 Ubuntu 24.04(glibc 2.39)等系统上启动。因此用于发布的发布包在固定为 2024 年 7 月 15 日 Arch Linux(glibc 2.39、Qt 6.7.2)的容器中构建(5.1)。该 AppImage 需要 glibc 2.38 及以上和 GCC 14 及以上的 libstdc++,可在 Ubuntu 24.04 及以上、Debian 13、Fedora 40 及以上等系统上运行(Fedora 39 的 libstdc++ 来自 GCC 13,无法运行)。

关于随附的 OpenSSL 和 libcurl: 容器中的其他软件包保持当时的版本,但随附的 OpenSSL、libcurl 以及 libcurl 使用的网络库(nghttp2、nghttp3、ngtcp2、libssh2)会替换为新版本(2026 年 10 月时为 OpenSSL 3.6.5、curl 8.23.0。见 5.1)。当时的 OpenSSL 3.3.1、curl 8.8.0 缺少之后的修复(如 CVE-2024-6119)。OpenSSL 无法改用系统自带的版本:随附的 libcurl(Qt Network 加载的 libproxy 用它获取代理自动配置(PAC))需要 OpenSSL 3.5 及以上的函数,在 OpenSSL 3.0 的 Ubuntu 24.04 上应用将无法启动。AppRun 通过 OPENSSL_CONF 让随附的 OpenSSL 读取随附的配置(usr/share/ShogiBoardQ/openssl.cnf)。系统的配置是为发行版的 OpenSSL 编写的,上游 OpenSSL 无法读取 Fedora 的配置(加密策略),曾导致联网对局无法使用 TLS。

2. 搭建开发环境

2.1 Arch Linux 与 Docker(制作发布包时)

用于发布的发布包在容器中构建,因此本机只需要 Docker、Git 和 Python 3(Qt 等构建所需的软件在容器中)。请把用户加入 docker 组并重新登录。

sudo usermod -aG docker $USER

docker 组的用户可以通过 docker 进行相当于 root 的操作。

直接在 Arch Linux 上构建和开发时,安装构建工具和 Arch 的 Qt 软件包。fcitx5-qt 用于把日语输入(fcitx5)的输入法插件放进 AppImage;未安装时不会随附该插件。

sudo pacman -S --needed base-devel cmake ninja git curl file python fuse2 imagemagick \
  qt6-base qt6-charts qt6-multimedia qt6-svg qt6-tools fcitx5-qt

2.2 其他发行版(仅构建应用程序)

在 Ubuntu、Debian 或 Fedora 上也可以构建和开发应用程序。需要 Qt 6.7 及以上,如果发行版提供的 Qt 较旧,请使用 Qt Online Installer 安装 Qt。

Ubuntu / Debian:

sudo apt install build-essential cmake ninja-build git \
  qt6-base-dev qt6-charts-dev qt6-multimedia-dev qt6-tools-dev qt6-tools-dev-tools \
  qt6-l10n-tools libqt6sql6-sqlite libgl1-mesa-dev

Fedora:

sudo dnf install gcc-c++ cmake ninja-build git \
  qt6-qtbase-devel qt6-qtcharts-devel qt6-qtmultimedia-devel qt6-qttools-devel \
  qt6-linguist mesa-libGL-devel

使用 Qt Online Installer 安装的 Qt 时,在配置 CMake 时指定其位置(示例为 Qt 6.11.2)。

cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_PREFIX_PATH="$HOME/Qt/6.11.2/gcc_64"

2.3 确认安装

cmake --version
g++ --version
qmake6 --version

3. 获取源代码并构建

获取仓库时请一并获取 Hayanagi 子模块。缺少子模块时,构建所需的文件会不完整。

git clone --recurse-submodules https://github.com/hnakada123/ShogiBoardQ.git
cd ShogiBoardQ

对于已获取的仓库,运行 git submodule update --init --recursive 获取所记录版本的 Hayanagi。然后以 Release 方式构建并启动。

cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
./build/ShogiBoardQ

运行测试:

cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON
cmake --build build
ctest --test-dir build --output-on-failure

只构建而不制作发布包时,也可以使用 ./scripts/build-linux.sh --skip-appimage。

4. 准备 Qt 的许可文档

AppImage 中收录从同版本 Qt 源代码中提取的许可文档,以及源代码来源的记录。请在制作发布包之前准备一次,更新 Qt 后重新准备。普通构建不需要。

Qt 的版本取决于构建环境。用于发布的容器(5.1)使用 Qt 6.7.2,因此获取并校验 Qt 6.7.2 的源代码(qt-everywhere),把文档提取到 build-container/qt-licenses。SHA-256 请用官方下载站点上与源代码位于同一位置的 .sha256 文件确认。

curl -fsSL https://download.qt.io/archive/qt/6.7/6.7.2/single/qt-everywhere-src-6.7.2.tar.xz.sha256
python3 scripts/qt_licenses.py fetch --version 6.7.2 \
  --sha256 0aaea247db870193c260e8453ae692ca12abc1bd841faa1a6e6c99459968ca8a \
  --output build-container/qt-sources
python3 scripts/qt_licenses.py prepare --version 6.7.2 \
  --archive build-container/qt-sources/qt-everywhere-src-6.7.2.tar.xz \
  --sha256 0aaea247db870193c260e8453ae692ca12abc1bd841faa1a6e6c99459968ca8a \
  --source-url https://download.qt.io/archive/qt/6.7/6.7.2/single/qt-everywhere-src-6.7.2.tar.xz \
  --provenance 'Arch Linux packages from the Arch Linux Archive snapshot 2024-07-15: qt6-base 6.7.2-1; qt6-charts, qt6-multimedia, qt6-svg 6.7.2-1; qt6-wayland 6.7.2-2. Upstream Qt source plus Arch PKGBUILDs and patches.' \
  --output build-container/qt-licenses

在 --provenance 中写明所用 Qt 的来源(包括 Arch 软件包的版本,以及适用 Arch 的补丁和构建步骤)。该内容会记录在 QT-SOURCE.json 中,并显示在“版本信息”的“获取源代码”里。直接在 Arch Linux 上构建时,请在 build/qt-licenses 中准备与 pacman -Q qt6-base 所示版本相同的文档。

  • prepare 不会覆盖已有的输出目录。重新准备时请指定新的输出目录。
  • 默认位置为构建目录(容器为 build-container,直接构建为 build)下的 qt-licenses。使用会删除构建目录的 --clean 时,请在其外部生成文档,并通过环境变量 SHOGIBOARDQ_QT_LICENSE_DIR 指定。
  • 不要把获取的 Qt 源代码和文档单独附加到发布中。方针详情请参阅 Qt 文档与发布附件方针(日文)。

5. 制作 AppImage 与 ZIP

5.1 运行脚本

用于发布的发布包在较旧的 Arch Linux(2024 年 7 月 15 日的 Arch Linux Archive;glibc 2.39、Qt 6.7.2)容器中制作。

制作用于发布的发布包时,请先把版本号改为发布当天的日期并提交(第 6 节)。

./scripts/build-linux-container.sh
  • 首次运行时会创建构建环境镜像(scripts/linux-container/Dockerfile,约 3GB)。从 Arch Linux Archive 下载较慢,需要数十分钟。
  • 在容器中以自己的用户运行 scripts/build-linux.sh。构建目录与平时的 build 分开,使用 build-container,输出放在仓库根目录。
  • 为当时的软件包签名的密钥中,有些后来已过期。镜像中用官方密钥环验证签名,但不要求密钥当前受信任。
  • 随附的 OpenSSL、libcurl 以及 libcurl 使用的网络库(nghttp2、nghttp3、ngtcp2、libssh2)因当时的版本缺少后来的修复,会替换为新版本。当前的 Arch 软件包先用 SHA-256(scripts/linux-container/packages.sha256)和签名验证后再安装;当前软件包会用到新版 glibc 函数的 curl,则在镜像中用同一版本的 Arch PKGBUILD 重新构建。
  • 升级版本时,在本机下载新的软件包及其 .sig,用 pacman-key --verify 验证签名,然后改写 packages.sha256。curl 则在 Dockerfile 的 CURL_PKGVER、CURL_PKGBUILD_SHA256 中写入 Arch 标签处 PKGBUILD 的 SHA-256(标签的签名用 curl-signing-key.asc 中的密钥验证)。请先确认新软件包需要的 glibc 版本(objdump -T 中 GLIBC_ 的最大值)不超过 2.38,超过的软件包在镜像中重新构建。修改 scripts/linux-container/ 后,build-linux-container.sh 会重新创建镜像。

也可以直接在 Arch Linux 上制作。这样制作的 AppImage 需要本机的 glibc 版本及以上(2026 年 10 月时为 2.43)。

./scripts/build-linux.sh

两个脚本都可以使用以下选项:

选项说明
--skip-appimage只构建,不制作 AppImage 与 ZIP
--clean删除构建目录后再构建
--help显示帮助
环境变量说明
SHOGIBOARDQ_BUILD_DIR构建目录(默认为 build;容器中为 build-container)
SHOGIBOARDQ_QT_LICENSE_DIR已准备的 Qt 文档的位置(默认为构建目录下的 qt-licenses)
APPIMAGE_EXTRACT_AND_RUN=1在无法使用 FUSE 的环境中,解压并运行 AppImage 格式的工具(容器中始终指定)
DOCKER仅用于容器。docker 命令(例如 sudo docker)
SHOGIBOARDQ_ARCH_SNAPSHOT仅用于容器。Arch Linux Archive 的日期(默认为 2024/07/15)

build-linux.sh 依次执行以下处理(在容器中,于容器内执行同样的处理):

  1. 检查所需工具(cmake、python3;推荐 ninja)
  2. 配置 CMake 并以 Release 方式构建(ShogiBoardQ 与 Hayanagi)
  3. 检查可执行文件、翻译文件,以及 3〜13 手诘的题集(每种手数各 1 个文件)
  4. 下载 linuxdeploy、其 Qt 插件和 appimagetool(仅首次;保存在构建目录中)。运行前与 build-linux.sh 中记录的 SHA-256 核对。它们都是上游会替换的 continuous 版本,被替换后核对不一致就会停止;此时先确认上游发布的 digest 和改动,再更新这些值
  5. 创建 AppDir 并生成 AppImage(运行所需的文件,以及 Qt 与随附库的许可文档)
  6. 制作包含 AppImage、题集和 Hayanagi 的 ZIP

输出为仓库根目录下的 ShogiBoardQ-linux-x86_64.AppImage 和 ShogiBoardQ-linux.zip。工作目录为构建目录下的 AppDir 和 ShogiBoardQ-linux/。

5.2 AppImage 的内容

AppImage 中只收录启动和运行应用程序所需的文件以及许可文档。

ShogiBoardQ-linux-x86_64.AppImage
└── (解压后)
    ├── AppRun                          ← 只使用随附的 Qt 和随附的 OpenSSL 配置启动
    ├── shogiboardq.desktop
    ├── shogiboardq.png
    └── usr/
        ├── bin/
        │   ├── ShogiBoardQ             ← 可执行文件
        │   ├── qt.conf                 ← Qt 插件的位置
        │   └── ShogiBoardQ_{ja_JP,en,zh_CN,zh_TW}.qm   ← 应用程序翻译(4 种语言)
        ├── lib/                        ← Qt 及其依赖库
        ├── plugins/
        │   ├── platforms/libqxcb.so            ← X11
        │   ├── imageformats/libqsvg.so, libqjpeg.so, libqico.so
        │   ├── iconengines/libqsvgicon.so
        │   ├── platforminputcontexts/          ← 日语输入(compose、fcitx5、ibus)
        │   ├── platformthemes/libqxdgdesktopportal.so
        │   ├── sqldrivers/libqsqlite.so        ← 诘棋作答记录与分析缓存
        │   └── tls/libqopensslbackend.so       ← 联网对局的 TLS 连接(OpenSSL)
        └── share/
            ├── applications/, icons/
            ├── ShogiBoardQ/openssl.cnf ← 随附的 OpenSSL 读取的配置(为空,不读取系统的配置)
            └── licenses/ShogiBoardQ/
                ├── NOTICE*.md, SOURCE_CODE*.md, GPL-3.0.txt, LGPL-3.0.txt
                ├── QT-NOTICES.md, qt/          ← 随附的 Qt 模块的文档
                ├── QT-SOURCE.json, BUILD.json  ← Qt 的来源与构建时版本
                └── THIRD-PARTY-NOTICES.md, third-party/   ← Qt 以外随附库的文档
  • 不收录题集、普通对局用的 Hayanagi、说明文档和题集的校验记录(validation_*.json)。应用程序不会从 AppImage 内部读取它们,用户也无法在其中选择文件,因此只作为 ZIP 中 AppImage 之外的文件发布。诘棋练习用的 Hayanagi 已内置于应用程序中。
  • 删除 linuxdeploy 放入的 Qt 标准翻译(usr/translations/)。标准对话框的日语和中文翻译已内置于可执行文件,应用程序的翻译从 usr/bin/ 读取。
  • 不收录用不到的插件:OpenGL 集成(xcbglintegrations)和 GIF 图像。没有使用 OpenGL 的界面部件。
  • tls 插件只收录 OpenSSL 后端(libqopensslbackend.so),用于 CSA 联网对局的“TLS(加密)”连接。libssl 和 libcrypto 作为其依赖库一并收录。应用程序不进行 HTTPS 等通信。
  • Qt 的许可文档只收录随附的 Qt 模块(qtbase、qtcharts、qtmultimedia、qtsvg、qttranslations、qtwayland)及其引用的文档(scripts/qt_licenses.py)。不收录 WebEngine 等未发布模块的文档。
  • 对于 Qt 以外的随附库(glib、PulseAudio、OpenSSL、fcitx5-qt 等约 50 个软件包),scripts/bundled_licenses.py 通过 pacman 查找所属软件包,把许可原文放入 third-party/,并在 THIRD-PARTY-NOTICES.md 中列出版本、许可和源代码获取位置。两者分别显示在“版本信息”的“Qt 中的第三方许可证”和“随附库的许可证”中。

5.3 ZIP 的内容

ZIP 中放入以下文件。解压 ZIP 后即可选择题集和 Hayanagi。

源文件在 ZIP 中的位置
ShogiBoardQ-linux-x86_64.AppImageShogiBoardQ-linux/
resources/platform/README-linux.mdShogiBoardQ-linux/README.md
LICENSEShogiBoardQ-linux/LICENSE
build/Hayanagi/hayanagiShogiBoardQ-linux/Hayanagi/hayanagi
build/Hayanagi/book/hayanagi_book.dbShogiBoardQ-linux/Hayanagi/book/hayanagi_book.db
Hayanagi/README.mdShogiBoardQ-linux/Hayanagi/README.md
data/tsumeshogi/tsume_{3,5,7,9,11,13}ply_*.txt, data/tsumeshogi/README.mdShogiBoardQ-linux/data/tsumeshogi/
ShogiBoardQ-linux.zip
└── ShogiBoardQ-linux/
    ├── ShogiBoardQ-linux-x86_64.AppImage
    ├── README.md
    ├── LICENSE
    ├── Hayanagi/
    │   ├── hayanagi
    │   ├── book/hayanagi_book.db   ← Hayanagi 的定式
    │   └── README.md
    └── data/tsumeshogi/
        ├── tsume_{3,5,7,9,11,13}ply_1000_20261001.txt   ← 6 个文件(各 1,000 题)
        └── README.md
  • 题集按原样复制。其哈希值与应用程序内置的审核记录一致,因此读取时可以复用已验证的手数和手顺。
  • data/tsumeshogi/ 中每种手数只放 1 个题集文件(仓库只跟踪当前的 20261001 版)。同一手数有多个文件时,脚本会报错并停止。
  • Hayanagi 经 strip 后放入。定式文件 hayanagi_book.db 由构建复制到 build/Hayanagi/book/,放入 Hayanagi/book/;Hayanagi 从可执行文件旁边的 book/ 读取定式。ZIP 中 AppImage 之外不放 docs/、validation_*.json 和 licenses/,许可文档位于 AppImage 内。

用户按以下方式启动。在诘棋练习的“打开题集…”中选择 data/tsumeshogi/ 中的题集;登记普通对局用的引擎时选择 Hayanagi/hayanagi。

unzip ShogiBoardQ-linux.zip
cd ShogiBoardQ-linux
chmod +x ShogiBoardQ-linux-x86_64.AppImage Hayanagi/hayanagi
./ShogiBoardQ-linux-x86_64.AppImage

5.4 运行确认

# 启动
./ShogiBoardQ-linux-x86_64.AppImage

# 解压并确认内容(不含 Hayanagi 和 Qt 标准翻译)
./ShogiBoardQ-linux-x86_64.AppImage --appimage-extract
ls squashfs-root/usr/bin/ squashfs-root/usr/plugins/*/
ls squashfs-root/usr/share/licenses/ShogiBoardQ/THIRD-PARTY-NOTICES.md
test ! -e squashfs-root/usr/bin/hayanagi && test ! -e squashfs-root/usr/translations && echo OK

# 所需的 glibc 版本
find squashfs-root/usr -type f \( -name '*.so*' -o -name ShogiBoardQ \) -exec objdump -T {} + 2>/dev/null \
  | grep -o 'GLIBC_[0-9.]*' | sort -uV | tail -1

# ZIP 中的 Hayanagi 能作为 USI 引擎响应
unzip -o -q ShogiBoardQ-linux.zip -d /tmp/zipcheck
printf 'usi\nisready\nquit\n' | /tmp/zipcheck/ShogiBoardQ-linux/Hayanagi/hayanagi

# ZIP 由预期的 12 个文件组成且没有损坏
python3 -m zipfile -l ShogiBoardQ-linux.zip
python3 -m zipfile -t ShogiBoardQ-linux.zip

在容器中构建时,所需的 glibc 版本应为 GLIBC_2.38 及以下。AppImage 使用系统中的 OpenGL(libEGL、libOpenGL)、fontconfig、HarfBuzz 和 wayland-client(普通桌面环境中已安装)。

请在 LD_LIBRARY_PATH 不包含 Qt 的 lib 目录的环境中确认,否则会使用系统中的库,发现不了遗漏的文件。如有可能,也请在 Ubuntu 24.04 等其他环境中确认日语、英语、中文的切换、SVG 棋子、棋子音效、诘棋记录的保存,以及“版本信息”中的许可证列表。

6. 在 GitHub Releases 上发布

版本号只在发布当天改为当天的日期。制作发布包之前,修改 CMakeLists.txt 中的 APP_VERSION 并提交,再从该提交制作发布包。同一天第二次及以后的发布,像 2026.10.07.1 这样加上第四个数字。标签(不加 v)和发布名称使用这个版本号。详情请参阅版本号与发布的规则(日文)。

Linux 只附加 ShogiBoardQ-linux.zip,文件名不随版本变化。

git tag -a 2026.10.07 -m "ShogiBoardQ 2026.10.07"
git push origin main 2026.10.07
gh release create 2026.10.07 --title "ShogiBoardQ 2026.10.07" \
  --notes-file RELEASE_NOTES.md ShogiBoardQ-linux.zip

如果已经先发布了其他操作系统的发布包,则添加到现有的发布中:

gh release upload 2026.10.07 ShogiBoardQ-linux.zip
  • 按文件名指定要附加的文件。不要上传整个工作目录或 build/ 中的文件。
  • 不要单独附加 Qt 源代码、QT-SOURCE.json、校验和或 SBOM 等。许可文档和源代码的获取方法位于 AppImage 内。
  • 发布后请确认附件列表。GitHub 自动显示的 Source code 链接与手动附加的文件是分开的。

在发布说明中写明 Linux 版的启动方法和运行条件(所需的 glibc 版本等)。

### 在 Linux 上启动

1. 下载并解压 ShogiBoardQ-linux.zip
2. chmod +x ShogiBoardQ-linux-x86_64.AppImage Hayanagi/hayanagi
3. ./ShogiBoardQ-linux-x86_64.AppImage

运行条件:x86_64 的 Linux,glibc 2.38 及以上、GCC 14 及以上的 libstdc++(Ubuntu 24.04 及以上、Debian 13、Fedora 40 及以上等)
没有 FUSE 时,可加上 --appimage-extract-and-run 启动。

仓库中的 release.yml 会在推送以 v 开头的标签或手动运行时构建三种操作系统,但其 Linux 任务运行在 Ubuntu 上。在随附库许可文档的收集支持 Ubuntu 之前,该任务无法制作 Linux 发布包,因此目前手动附加在 Arch Linux 容器中制作的 ZIP。

7. 故障排除

找不到 Qt

Could not find a package configuration file provided by "Qt6"

确认已安装 Qt 6.7 及以上和所需模块。使用 Qt Online Installer 的 Qt 时,用 -DCMAKE_PREFIX_PATH 指定。更换 Qt 或 CMake 生成器后,请在新的 build 目录中重新开始。

缺少 Hayanagi 的源代码

在仓库根目录运行 git submodule update --init --recursive。

因存在多个题集而停止

==> ERROR: 5手詰の問題集が複数あります: data/tsumeshogi/tsume_5ply_1000_20260926.txt data/tsumeshogi/tsume_5ply_1000_20261001.txt

data/tsumeshogi/ 中残留了旧版题集(消息表示同一手数找到了多个题集)。请删除不用的版本,使每种手数只剩 1 个文件。

Qt 文档的校验失败

Qt license preparation failed: Qt version mismatch: build=6.7.2, source=6.11.2
Qt license preparation failed: Qt notices are missing. See docs/dev/qt-licensing.md; set SHOGIBOARDQ_QT_LICENSE_DIR to prepared matching notices.

请准备与构建所用 Qt 同版本的文档(第 4 节):容器中为 Qt 6.7.2,直接在 Arch Linux 上构建时为 pacman -Q qt6-base 所示的版本。不要忽略失败而继续发布。

收集随附库的文档时停止

Bundled library notices failed: Bundled library notices need pacman (Arch Linux); other distributions are not supported yet
Bundled library notices failed: Cannot find the system file of lib/libQt6Core.so.6
Bundled library notices failed: No license text for bundled package fcitx5-qt (GPL)
  • 请在 Arch Linux 上使用 Arch 的 Qt 软件包制作发布包。如果 AppImage 中含有不属于 pacman 软件包的库(例如通过 Qt Online Installer 安装的 Qt),就无法确定其所属软件包,脚本会停止。
  • No license text for … 表示有软件包找不到许可原文。较旧的软件仓库中,许可字段可能不是 SPDX 表达式,请在 scripts/bundled_licenses.py 的 LICENSE_OVERRIDES 中加入上游的写法。软件包中没有的文档(例如带有实际版权声明的原文)放在 scripts/license-texts/<软件包名>/ 中。

无法使用 docker

permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

把用户加入 docker 组并重新登录(sudo usermod -aG docker $USER),或指定环境变量 DOCKER="sudo docker"。

linuxdeploy 无法启动

dlopen(): error loading libfuse.so.2

安装 fuse2,或用 APPIMAGE_EXTRACT_AND_RUN=1 ./scripts/build-linux.sh 运行。

AppImage 无法启动(FUSE)

AppImages require FUSE to run.

安装 FUSE 2,或加上 --appimage-extract-and-run 启动。

./ShogiBoardQ-linux-x86_64.AppImage --appimage-extract-and-run

glibc 版本不足

version `GLIBC_2.38' not found

运行系统的 glibc 比构建环境旧。用于发布的发布包请在容器中构建(5.1)。仍然不足时,请在 glibc 更新的发行版上使用(参阅前提条件中关于 glibc 的说明)。

找不到系统库

error while loading shared libraries: libOpenGL.so.0: cannot open shared object file: No such file or directory

系统中缺少 AppImage 不随附的库(OpenGL、fontconfig、HarfBuzz、wayland-client)。Ubuntu / Debian 的示例:

sudo apt install libegl1 libopengl0 libfontconfig1 libharfbuzz0b libwayland-client0

无法加载 xcb 平台插件

qt.qpa.plugin: Could not load the Qt platform plugin "xcb"

缺少 X11 相关的库。以下依次为 Ubuntu / Debian、Fedora、Arch Linux 的示例:

sudo apt install libxcb-cursor0 libxcb-xinerama0
sudo dnf install xcb-util-cursor xcb-util-wm xcb-util-keysyms
sudo pacman -S xcb-util-cursor xcb-util-wm xcb-util-keysyms

无法输入日语

AppImage 只随附 X11 平台插件,因此在 Wayland 桌面上也会通过 XWayland 运行。未设置环境变量 QT_IM_MODULE 时,不会选用日语输入法插件。使用 fcitx5 时请加上 QT_IM_MODULE=fcitx,使用 IBus 时请加上 QT_IM_MODULE=ibus 启动。

QT_IM_MODULE=fcitx ./ShogiBoardQ-linux-x86_64.AppImage

无法加载翻译

确认 .qm 文件位于可执行文件所在的 usr/bin/ 中。

./ShogiBoardQ-linux-x86_64.AppImage --appimage-extract
ls squashfs-root/usr/bin/*.qm