交叉编译MySql(arm64平台)

目标说明

在 x86 Ubuntu 主机上交叉编译 MySQL,使其能够运行在 arm64 架构的 Ubuntu 系统中,并确保 Qt 可通过 QMYSQL 驱动调用该库。
环境准备:

  • 操作系统:x86_64 架构的 Ubuntu(推荐 20.04 或 22.04)
  • 目标平台:arm64 架构 Ubuntu 系统
  • 工具链:aarch64-linux-gnu-gcc(交叉编译器)
  • Qt:arm64 平台已编译好,需支持 SQL 插件
  • 数据库版本:MySQL 5.7 或 8.0(也可选 MariaDB)

安装交叉编译工具链

1
2
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

获取 MySQL 源码

推荐使用 MySQL 官方源码或 MariaDB(更适合嵌入式):

下载 MySQL 5.7 示例:

1
2
3
4
5


wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.43.tar.gz
tar -xzf mysql-5.7.43.tar.gz
cd mysql-5.7.43

或下载 MariaDB:

1
2
3
wget https://downloads.mariadb.org/interstitial/mariadb-10.6.17/source/mariadb-10.6.17.tar.gz
tar -xzf mariadb-10.6.17.tar.gz
cd mariadb-10.6.17

设置交叉编译配置

创建安装目录

1
2
3
4


mkdir -p ~/arm64-rootfs/mysql
export MYSQL_INSTALL_DIR=~/arm64-rootfs/mysql

编写交叉编译工具链文件 toolchain-arm64.cmake

1
2
3
4
5
6
7
8
9
10
11
12


SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR aarch64)

SET(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
SET(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

编译 MySQL / MariaDB

进入构建目录并配置编译参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


mkdir build
cd build

cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../toolchain-arm64.cmake \
-DCMAKE_INSTALL_PREFIX=${MYSQL_INSTALL_DIR} \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_UNIT_TESTS=OFF \
-DWITH_DEBUG=OFF \
-DWITHOUT_SERVER=ON \
-DWITHOUT_CLIENT=ON \
-DWITH_LIBMYSQL=ON

make -j$(nproc)
make install

验证

打包传输

1
2
3
cd ${MYSQL_INSTALL_DIR}
tar -czf mysql-arm64.tar.gz *
scp mysql-arm64.tar.gz user@arm64-target:/opt/

解压到目标系统

1
2
cd /opt
tar -xzf mysql-arm64.tar.gz

链接
方式一:Qt 编译时集成 MySQL 支持

1
2
3
4
5
./configure -opensource -confirm-license -prefix /opt/qt-arm64 \
-xplatform linux-aarch64-gnu-g++ \
-sql-mysql \
-I/path/to/mysql/include \
-L/path/to/mysql/lib

方式二:单独编译 Qt 的 QMYSQL 插件

1
2
3
4
cd $QT_SRC/qtbase/src/plugins/sqldrivers
qmake "INCLUDEPATH+=/opt/mysql/include" "LIBS+=-L/opt/mysql/lib -lmysqlclient" mysql.pro
make
make install

测试 Qt 程序连接数据库

1
2
3
4
5
6
7
8
9
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("123456");

if (!db.open()) {
qDebug() << "Failed to connect to database:" << db.lastError().text();
}

常见问题及解决方案

1、找不到 libmysqlclient.so
设置环境变量 LD_LIBRARY_PATH 指向该库路径

2、Qt 不识别 QMYSQL 驱动
检查插件目录中是否有 libqsqlmysql.so,可设置 QT_DEBUG_PLUGINS=1

3、编译错误 undefined reference
检查链接参数中是否正确加入 -lmysqlclient 和路径