如何交叉编译安装了 mariadb10 的 RPI3(Stretch)以与 QTCreator 一起使用?

How to cross compile a RPI3 (Stretch) with mariadb10 installed for use with QTCreator?

我正在交叉编译一个 QTCreator (5.9) C++ 程序,专门用于 RPi 3 运行ning Stretch 和 mariadb10。我在编译时遇到 MYSQL 可用的问题。主机是 运行ning Ubuntu 18.

我已经 运行 以下行来创建交叉编译库。一切似乎都很好,除了 MYSQL 不可用:

cd ~/raspi3;
git clone https://github.com/raspberrypi/tools;
git clone git://code.qt.io/qt/qtbase.git -b 5.9;
cp ~/Desktop/sysroot-relativelinks.py ~/raspi3; #Copy previously downloaded file. No longer available as of 2/5/2019 at recommended https://raw.githubusercontent.com/riscv/riscv-poky/priv-1.10/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py;
mkdir sysroot/usr sysroot/opt;
rsync -avz pi@$ip:/lib sysroot;
rsync -avz pi@$ip:/usr/include sysroot/usr;
rsync -avz pi@$ip:/usr/lib sysroot/usr;
rsync -avz pi@$ip:/opt/vc sysroot/opt;
python ./sysroot-relativelinks.py sysroot;
cd qtbase;
./configure -release -opengl es2 -device linux-rasp-pi3-g++ -I /usr/arm-linux-gnueabihf -device-option CROSS_COMPILE=~/raspi3/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sql-mysql MYSQL_INCDIR=~/raspi3/sysroot/usr/include/mysql MYSQL_LIBDIR=~/raspi3/sysroot/usr/lib/arm-linux-gnueabihf MYSQL_LIBS="-lmariadbclient" -sysroot ~/raspi3/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi3/qt5pi -hostprefix ~/raspi3/qt5 -v -nomake examples -nomake tests -nomake tools -no-use-gold-linker -recheck-all;

以上 ./configure 运行s 并生成以下报告(摘录):

Qt Sql:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. no
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. yes
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... yes

Note: Also available for Linux: linux-clang linux-icc

Note: PKG_CONFIG_LIBDIR automatically set to /home/max/raspi3/sysroot/usr/lib/pkgconfig:/home/max/raspi3/sysroot/usr/share/pkgconfig:/home/max/raspi3/sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig

Note: PKG_CONFIG_SYSROOT_DIR automatically set to /home/max/raspi3/sysroot

Note: Dropped compiler flags '-pthread' when detecting library 'glib'.

ERROR: Feature 'sql-mysql' was enabled, but the pre-condition 'libs.mysql' failed.

注意:我也尝试删除 MYSQL_INCDIR、MYSQL_LIBDIR 和 MYSQL_LIBS,结果没有任何变化

当我编译和运行在QTCreator中创建的程序时,我可以看到没有可用的QMYSQL驱动程序并且没有数据库连接:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 QTDS QTDS7
FAILED TO CONNECT TO DB

我已经四处寻找并尝试了我遇到的所有合理的方法。谁能告诉我 ./compile 中可能有什么问题导致了这个问题?

好的,我已经成功了并且有一个可行的解决方案。 我按照本教程设置了一个交叉编译环境 https://mechatronicsblog.com/cross-compile-and-deploy-qt-5-12-for-raspberry-pi/

但是,我在考虑 MySQL 的情况下进行了一些更改。 首先,在 Raspberry Pi 方面,我为 MariaDB 安装了额外的软件包,因为它取代了 Debian Buster 中的 MySQL。我还在我的 Raspberry Pi 3 B+ 上使用了 Respbian 精简版 (Buster)。

我的 Linux 主机是:Linux 虚拟机中的 Mint 19.3。因为肉桂棒棒哒(^^,)

在Raspberry Pi SSH 上并安装。

sudo apt install mariadb-client mariadb-common mysql-common libmariadb-dev-compat libmariadbclient-dev libqt5sql5-mysql libqt5sql5 libqt5sql5-sqlite

作为旁注。不确定是否需要它,但在 Raspberry Pi 上我还安装了 libqt5core 和一堆其他与 Qt 相关的库。网络、小部件、核心等。

libmariadb-dev-compat 包将创建 mariadb 和 mysql 之间兼容性所需的所有链接。然后,当您调用 qt 配置脚本时,您必须指明 mysql (mariadb) 库的路径:

退出 Raspberry Pi SSH 会话。 在主机上。
确保在安装所有 MariaDB 库等之后 运行 rsync。 按照教程。

rsync -avz pi@raspberrypi_ip:/lib sysroot
rsync -avz pi@raspberrypi_ip:/usr/include sysroot/usr
rsync -avz pi@raspberrypi_ip:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi_ip:/opt/vc sysroot/opt

现在要配置 Qt-Everywhere(我使用的是 Qt 5.12.5),我们需要将 MySQL 添加到 make 配置中

这是我为 Qt 5.12.5 使用 MySQL(MariaDB) 驱动程序从源代码编译它的确切配置脚本。

./configure -release -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -skip qtwayland -skip qtlocation -skip qtscript -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -v -no-gbm -sql-mysql MYSQL_INCDIR=~/raspi/sysroot/usr/include/mysql MYSQL_LIBDIR=~/raspi/sysroot/usr/lib/arm-linux-gnueabihf

配置步骤后,检查以确认 MySQL 设置为是。 类似于:

 Qt Sql Drivers:
 DB2 (IBM) .............................. no
 InterBase .............................. no
 MySql .................................. yes
 OCI (Oracle) ........................... no
 ODBC ................................... no
 PostgreSQL ............................. yes
 SQLite2 ................................ no
 SQLite ................................. yes

继续使用列出的教程,直到您将覆盆子添加为 Qt Creator 中的设备....

昨晚编译了 ~24 小时后让我咳嗽到很晚的另一件事

在 Qt 5.14.1 中,当在 Qt creator 中设置设备 (Raspberry Pi) 时,您现在必须使用 SSH 密钥。 密码选项不再存在。让 Qt 生成 SSH 密钥并通过 SCP 或其他方式将其复制到您的 raspberry pi。 "qtc_id.pub" 文件进入 /home/pi/.ssh,然后在 .ssh 文件夹中创建一个名为 "authorized_keys" 的文件。

touch ~/.ssh/authorized_keys

下一个

cat "qtc_id.pub" >> authorized_keys

这只是将名称 qtc_id.pub 作为纯文本复制到该文件中。保存文件并退出。那么

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

您现在应该能够连接到 Raspberry Pi,当您按照上述教程中的说明在 Qt Creator 中进行设置时。

还有: 我尝试使用最新的 Qt 5.14.1 源代码构建它。它因多个问题而失败,我只是没有时间或精力去尝试和解决这些问题。我只想开始对项目进行编程。

我希望这对您@Max 和其他人有所帮助。对我来说,我是成功的。 这是一场半场的斗争。从源代码构建 Qt 并设置 raspberry Pi 交叉编译环境是我在很长一段时间内经历过的最令人沮丧的事情。大多数时候文档已经过时或者非常模糊。很多事情都可能出错,但现在这是我能让一切正常工作的唯一方法。在已经编译了 Qt 之后,我仍然不知道如何编译 MySQL。就像只编译 MySQL 插件驱动器一样。不知道。

来自南非的问候