# sAkura-io

> ska 的个人编程博客：文章、笔记与友链。

以下为本站全部已发布内容的 Markdown 全文，共 5 篇。

## 本站试运行！（发布于 2026-09-15）

来源: https://www.sakura-io.com/posts/ben-zhan-shi-yun-xing

123456789

---

## 测试文章qwq（发布于 2026-09-14）

来源: https://www.sakura-io.com/posts/ce-shi-wen-zhang-q-w-q

# 测试文章qwq

<img src="https://s3.sakura-io.com/library/2026/08/0b687c0c-8d70-4e78-938d-5e616a50efb8.webp" alt="0b687c0c-8d70-4e78-938d-5e616a50efb8.webp" loading="lazy" decoding="async">

---

## 你好世界（发布于 2026-09-10）

来源: https://www.sakura-io.com/notes/ni-hao-shi-jie

# 你好世界

<img src="https://s3.sakura-io.com/library/2026/09/21c1cb67-0c7f-4336-b01f-48a560632b79.webp" alt="21c1cb67-0c7f-4336-b01f-48a560632b79.webp" loading="lazy" decoding="async">

---

## QT（发布于 2026-08-29）

来源: https://www.sakura-io.com/posts/qt

# 树莓派 Qt6 交叉编译与环境搭建指南

> **注意事项：**
>
> 1. 本文所有指令**千万不要直接复制执行**，因为用户名及路径可能不同，请根据实际环境替换！
> 2. 若使用 **WSL2** 进行构建，在 `configure` 阶段需要等待很久，因为 WSL2 的跨盘/虚拟化 I/O 性能相对较差。


***

## 前置条件 1：检查 glibc 版本一致性

**目标系统的 glibc 版本必须与编译机一致**（例如：树莓派系统推荐编译机使用 Debian 12）。版本过高或过低都会导致链接失败。

不可使用第三方工具链（如 ARM 官方工具链），容易缺失特定依赖文件导致编译失败。

可以在目标机与编译机上分别执行以下指令查看 glibc 版本：

```bash
ldd --version
```

***

## 前置条件 2：在目标系统上安装必要依赖并打包 sysroot

### 1. 安装编译与运行依赖

```bash
sudo apt update
 
sudo apt install build-essential libgl1-mesa-dev libfontconfig1-dev libdbus-1-dev libssl-dev libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-x11-dev libxcb-cursor-dev libxcb-util-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-render-util0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-sync-dev libxcb-xinput0
```

#### Linux 桌面组件支持：

```bash
sudo apt install \
    libfontconfig1-dev \
    libfreetype-dev \
    libgtk-3-dev \
    libx11-dev \
    libx11-xcb-dev \
    libxcb-cursor-dev \
    libxcb-glx0-dev \
    libxcb-icccm4-dev \
    libxcb-image0-dev \
    libxcb-keysyms1-dev \
    libxcb-randr0-dev \
    libxcb-render-util0-dev \
    libxcb-shape0-dev \
    libxcb-shm0-dev \
    libxcb-sync-dev \
    libxcb-util-dev \
    libxcb-xfixes0-dev \
    libxcb-xkb-dev \
    libxcb1-dev \
    libxext-dev \
    libxfixes-dev \
    libxi-dev \
    libxkbcommon-dev \
    libxkbcommon-x11-dev \
    libxrender-dev
```

#### 运行时与基础 XCB 库：

```bash
sudo apt install \
    libxcb1 libx11-xcb1 libxrender1 libxi6 libxkbcommon0 libxext6 libxfixes3 libxrandr2 libxinerama1 libxcursor1 libxcomposite1 libxdamage1 libx11-dev \
    libxkbcommon-dev libfontconfig1 libfreetype6 libpng-dev libglib2.0-0 libdbus-1-3 libdbus-1-dev \
    libxcb1-dev libxcb-util1 libxcb-util-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-image0 libxcb-image0-dev libxcb-keysyms1 libxcb-keysyms1-dev \
    libxcb-render0 libxcb-render0-dev libxcb-shape0 libxcb-shape0-dev libxcb-shm0 libxcb-shm0-dev libxcb-sync1 libxcb-sync-dev libxcb-xfixes0 libxcb-xfixes0-dev \
    libxcb-xinerama0 libxcb-xinerama0-dev libxcb-xkb1 libxcb-xkb-dev libxcb-randr0 libxcb-randr0-dev libxcb-composite0 libxcb-composite0-dev libxcb-damage0 libxcb-damage0-dev
```

#### 补充图形及系统支持库：

```bash
sudo apt-get install \
    libxcb1-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev \
    libxcb-render0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-shm0-dev \
    libxcb-sync-dev libxcb-xfixes0-dev libxcb-xkb-dev libxcb-randr0-dev \
    libxcb-cursor-dev libxcb-glx0-dev libxcb-xinput-dev libx11-dev libx11-xcb-dev \
    libxkbcommon-dev libxkbcommon-x11-dev libxrender-dev libxext-dev libsm-dev libice-dev \
    libfreetype6-dev libfontconfig1-dev libharfbuzz-dev libjpeg-dev libpng-dev libmd4c-dev \
    libgl-dev libegl1-mesa-dev libgles2-mesa-dev libvulkan-dev zlib1g-dev libdrm-dev \
    libinput-dev libts-dev libmtdev-dev libatspi2.0-dev libwayland-dev

sudo apt install "libxcb*"
sudo apt install "libxkbcommon*" 
sudo apt-get install libmd4c-dev
```

***

### 2. 同步与打包 sysroot

```bash
mkdir -p ~/sysroot
```

#### 方式一：基础同步指令

```bash
sudo rsync -avz --delete \
  --exclude='/dev/*' \
  --exclude='/proc/*' \
  --exclude='/sys/*' \
  --exclude='/tmp/*' \
  --exclude='/run/*' \
  --exclude='/mnt/*' \
  --exclude='/media/*' \
  --exclude='/home/*' \
  --exclude='/lost+found' \
  / ~/sysroot
```

#### 方式二：精简同步指令（排除更多无关目录，加快速度）

```bash
sudo rsync -avz --delete \
  --exclude='/dev/*' \
  --exclude='/proc/*' \
  --exclude='/sys/*' \
  --exclude='/tmp/*' \
  --exclude='/run/*' \
  --exclude='/mnt/*' \
  --exclude='/media/*' \
  --exclude='/home/*' \
  --exclude='/lost+found' \
  --exclude='/var/lib/docker/*' \
  --exclude='/var/run/*' \
  --exclude='/var/tmp/*' \
  --exclude='/var/cache/*' \
  --exclude='/var/lock/*' \
  --exclude='/swapfile' \
  --exclude='/opt/containerd/*' \
  --exclude='/opt/1panel/*' \
  --exclude='/opt/pigpio/*' \
  --exclude='/opt/Scratch 3/*' \
  --exclude='/opt/WidevineCdm/*' \
  --exclude='/opt/Wolfram/*' \
  / ~/sysroot
```

#### 打包并拷贝

```bash
sudo tar czf sysroot.tar.gz sysroot
```

> 打包完成后，可通过 U 盘、网络传输或 SCP 拷贝到编译机。

***

## 前置条件 3：在编译机解压 sysroot 并安装交叉编译工具

### 1. 解压 sysroot

推荐解压到用户主目录或根目录下（需要 root 权限）：

* **单线程解压：**
  ```bash
  sudo tar xzf ~/sysroot.tar.gz -C ~/
  ```
* **推荐多线程解压（需安装 pigz）：**
  ```bash
  sudo tar --use-compress-program=pigz -xvf ~/sysroot.tar.gz
  ```

***

### 2. 安装交叉编译工具链

此处推荐安装 `ninja` 构建工具（解决 `make` 编译报错问题）：

```bash
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu ninja-build libglib2.0-0 libglib2.0-dev libxkbcommon0 libxkbcommon-dev libgl1

sudo apt install -y build-essential cmake ninja-build libgl1 libgl-dev libegl1 libegl-dev libx11-6 libx11-dev libxext6 libxext-dev libxrender1 libxrender-dev libxcb1 libxcb1-dev libxkbcommon0 libxkbcommon-dev libfontconfig1 libfontconfig1-dev libfreetype6 libfreetype6-dev libpng16-16 libpng-dev libjpeg62-turbo libjpeg-dev libinput10 libinput-dev libwayland-client0 libwayland-dev libwayland-egl1 libdrm2 libdrm-dev libgbm1 libgbm-dev libssl-dev zlib1g-dev libsqlite3-dev libicu-dev libdbus-1-3 libdbus-1-dev
```

***

### 3. 编译机安装 Qt

使用官方在线安装程序（可搭配南京大学镜像加速）：

```bash
./qt-online-installer-linux-x64-4.10.0.run --mirror [https://mirror.nju.edu.cn/qt/](https://mirror.nju.edu.cn/qt/)
```

> **备注：** WSL2 同样支持直接运行 Qt 官方安装器图形界面。

***

## 配置交叉编译环境与编译 Qt

### 1. 创建工具链配置文件

进入安装版本的源码目录（例如 `/home/ska/Qt/6.7.3/Src`），创建 `toolchain.cmake`：

```cmake
set(CMAKE_SYSTEM_NAME Linux) # 目标机器系统
set(CMAKE_SYSTEM_PROCESSOR aarch64) # 目标架构

# 你的 sysroot 绝对路径（建议避免使用 ~ 相对路径）
set(CMAKE_SYSROOT /home/用户名/sysroot)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})

set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(CMAKE_FIND_LIBRARY_SUFFIXES ".so;.a")
```

将工具链配置文件复制一份至上一层目录：

```bash
cp ./toolchain.cmake ..
```

***

### 2. 设置环境变量

```bash
# Qt 编译安装的目标路径
export INSTALL_PATH=/usr/local/raspi-qt6

# 编译机本地 Host Qt 路径
export QT_HOME=/home/用户名/Qt/6.7.3/gcc_64
```

***

### 3. 执行 Configure 配置

#### 基础配置（跳过非必要模块与 OpenGL）：

```bash
../configure -release \
  -platform linux-aarch64-gnu-g++ \
  -device linux-aarch64-gnu-gcc \
  -qt-host-path $QT_HOME \
  -prefix $INSTALL_PATH \
  -no-opengl \
  -no-openssl \
  -skip qtgrpc -skip qtprotobuf -skip qtwebengine -skip qtopcua \
  -- -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
```

#### 带 OpenGL ES2 支持：

```bash
../configure -release \
  -platform linux-aarch64-gnu-g++ \
  -device linux-aarch64-gnu-gcc \
  -qt-host-path $QT_HOME \
  -prefix $INSTALL_PATH \
  -opengl es2 \
  -no-openssl \
  -skip qtgrpc -skip qtprotobuf -skip qtwebengine -skip qtopcua \
  -- -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
```

#### 带 XCB 支持（推荐完整桌面开发）：

```bash
export PKG_CONFIG_LIBDIR=/home/ska/sysroot/usr/lib/aarch64-linux-gnu/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=/home/ska/sysroot

../configure -release \
  -platform linux-aarch64-gnu-g++ \
  -device linux-aarch64-gnu-gcc \
  -qt-host-path $QT_HOME \
  -prefix $INSTALL_PATH \
  -opengl es2 \
  -no-openssl \
  -skip qtgrpc -skip qtprotobuf -skip qtwebengine -skip qtopcua \
  -xcb \
  -- -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
     -DQT_FEATURE_system_md4c=OFF \
     -DQT_FEATURE_md4c=OFF \
     -DXKB_COMMON_X11_LIBRARY=/home/ska/sysroot/usr/lib/aarch64-linux-gnu/libxkbcommon-x11.so \
     -DXKB_COMMON_X11_INCLUDE_DIR=/home/ska/sysroot/usr/include/xkbcommon
```

***

### 4. 编译与安装

```bash
cmake --build . --parallel
```

> **注意：** 若编译过程中遇到 DBus 静态链接冲突错误，可重命名静态库：
>
> ```bash
> sudo mv /home/用户名/sysroot/usr/lib/aarch64-linux-gnu/libdbus-1.a /home/用户名/sysroot/usr/lib/aarch64-linux-gnu/libdbus-1.a.bak
> ```

编译完成后安装到指定系统目录：

```bash
sudo cmake --install .
```

***

### 5. 复制库到目标机器并在目标机配置环境

#### 传输库文件：

```bash
scp -r /usr/local/raspi-qt6/* 目标机器用户名@ip地址:/home/用户名/qt6
```

#### 在目标机配置环境变量（修改 `~/.bashrc`）：

```bash
vim ~/.bashrc
```

在末尾添加：

```bash
export LD_LIBRARY_PATH=/home/用户名/qt6/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/用户名/qt6/plugins
export QML2_IMPORT_PATH=/home/用户名/qt6/qml
export PATH=/home/用户名/qt6/bin:$PATH
```

刷新配置：

```bash
source ~/.bashrc
```

***

## IDE 与开发环境配置

### 方案 A：Qt Creator 配置 (参考)

1. **Qt 版本**：配置编译安装后的 qmake/Qt 路径。
2. **编译器**：配置 `aarch64-linux-gnu-gcc` 与 `aarch64-linux-gnu-g++`。
3. **设备连接**：在“设备”选项中添加远程目标机 IP 与 SSH 凭据。
4. **构建套件 CMake 配置**：

```cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_SYSROOT /home/ska/sysroot)
set(CMAKE_FIND_ROOT_PATH /home/ska/sysroot /usr/local/raspi-qt6)

set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(CMAKE_AR /usr/bin/aarch64-linux-gnu-ar)
set(CMAKE_RANLIB /usr/bin/aarch64-linux-gnu-ranlib)
set(CMAKE_OBJDUMP /usr/bin/aarch64-linux-gnu-objdump)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_PREFIX_PATH "/usr/local/raspi-qt6")

set(CMAKE_FIND_LIBRARY_SUFFIXES ".so;.a")
```

> **补充处理：** 若 Qt Creator 优先读取了 sysroot 里的 ninja，可重命名避免冲突：
>
> ```bash
> sudo mv /home/ska/sysroot/usr/bin/ninja /home/ska/sysroot/usr/bin/ninja_bkup
> ```

***

### 方案 B：使用 VSCode 交叉编译（推荐）

#### 1. 项目根目录创建 `CMakePresets.json`

```json
{
    "version": 8,
    "configurePresets": [
        {
            "name": "cross",
            "displayName": "GCC 12.2.0 aarch64-linux-gnu",
            "description": "正在使用编译器: C = /usr/bin/aarch64-linux-gnu-gcc, CXX = /usr/bin/aarch64-linux-gnu-g++",
            "binaryDir": "${sourceDir}/out/build/${presetName}",
            "cacheVariables": {
                "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
                "CMAKE_SYSTEM_NAME": "Linux",
                "CMAKE_SYSTEM_PROCESSOR": "aarch64",
                "CMAKE_SYSROOT": "/home/ska/sysroot",
                "CMAKE_FIND_ROOT_PATH": "/home/ska/sysroot;/usr/local/raspi-qt6",
                "CMAKE_C_COMPILER": "/usr/bin/aarch64-linux-gnu-gcc",
                "CMAKE_CXX_COMPILER": "/usr/bin/aarch64-linux-gnu-g++",
                "CMAKE_FIND_ROOT_PATH_MODE_PROGRAM": "NEVER",
                "CMAKE_FIND_ROOT_PATH_MODE_LIBRARY": "ONLY",
                "CMAKE_FIND_ROOT_PATH_MODE_INCLUDE": "ONLY",
                "CMAKE_FIND_ROOT_PATH_MODE_PACKAGE": "ONLY",
                "CMAKE_FIND_LIBRARY_SUFFIXES": ".so;.a",
                "CMAKE_BUILD_TYPE": "Debug"
            }
        }
    ]
}
```

#### 2. 在 `CMakeLists.txt` 中指定 Qt 路径

```cmake
set(QT_SDK_DIR /usr/local/raspi-qt6 CACHE PATH "QT SDK DIR" FORCE)
```

***

*如果该博客帮到了你，不妨请作者喝杯奶茶\~*

---

## 欢迎来到新博客（发布于 2026-08-26）

来源: https://www.sakura-io.com/posts/hello-ska-web

# 你好

这是 **ska-web** 的第一篇文章。

- GFM 列表
- 代码高亮

```ts
export const hello = "ska"
console.log(hello)
```
