Linux下Qt MySQL驱动编译实战:解决QMYSQL not loaded
1. 项目概述为什么在Linux下手动编译Qt的MySQL驱动成了“必修课”如果你正在Linux环境下用Qt开发数据库应用十有八九会卡在“QSqlDatabase: QMYSQL driver not loaded”这行报错上。这不是你代码写错了而是Qt官方二进制安装包尤其是通过apt、dnf或在线安装器获取的版本默认不附带MySQL/MariaDB驱动插件——它被刻意剥离了。原因很实际Qt本身不打包第三方数据库客户端库而MySQL和MariaDB的客户端动态库libmysqlclient.so 或 libmariadb.so在不同发行版、不同版本间路径不一、ABI不兼容、许可证存在差异强行捆绑反而会导致部署失败或法律风险。所以Qt选择“按需加载”把驱动编译这件事交还给开发者自己。但问题来了qmake -project qmake make一路顺风到了运行时却提示“driver not loaded”查ldd发现插件so文件依赖缺失QSqlDatabase::drivers()返回空列表……更让人抓狂的是执行qmake时可能直接报错“Project ERROR: Library mysql is not defined.”——这说明qmake根本没找到MySQL开发头文件和库文件连编译驱动的第一步都迈不出去。这不是配置疏忽而是Linux生态里典型的“依赖可见性”问题系统装了MariaDB client但头文件可能在/usr/include/mariadb库文件在/usr/lib/x86_64-linux-gnu/而Qt的qmake默认只认/usr/include和/usr/lib这种“经典路径”。我去年在某高校实验室帮学生调试一个跨平台数据采集终端就遇到过三次典型场景一次是Ubuntu 22.04上MariaDB 10.6的头文件被装进了/usr/include/mariadb但qmake脚本硬编码找mysql.h一次是CentOS 7里libmysqlclient.so软链接指向了旧版而Qt插件编译时链接了旧符号运行时报undefined symbol: mysql_options4还有一次是学生自己编译了Qt 5.15.2但忘了在configure阶段加-sql-mysql参数导致整个SQL模块压根没启用。这些都不是“不会写代码”的问题而是对Linux下库管理、路径约定、构建系统耦合关系的理解断层。这篇内容就是为了解决这个断层——不讲虚的只说你在终端里敲什么命令、改哪几行配置、看哪几个文件、为什么必须这么干。核心关键词全部落在实操层面Linux、QT、Mysql驱动、Mariadb驱动、qmake报错。它面向三类人刚从Windows转Linux的Qt新手以为.pro文件写完就能跑、需要交付稳定嵌入式数据库应用的工程师不能依赖用户自行装库、以及负责维护内部Qt基础镜像的DevOps人员要固化可复现的构建流程。接下来所有内容都基于真实终端操作日志、gdb调试记录和反复验证的最小可行配置展开没有假设只有验证过的路径和参数。2. 编译思路拆解为什么不能直接“make make install”而必须重走qmake全流程很多人第一次尝试时会直奔Qt源码目录下的src/plugins/sqldrivers/mysql/执行qmake然后make以为生成的libqsqlmysql.so丢进plugins/sqldrivers/就万事大吉。结果运行时依然报错。问题出在三个被忽略的耦合点上第一qmake的mysql探测逻辑是静态的。它不是在运行时动态扫描系统而是在qmake执行那一刻根据当前环境变量MYSQL_PREFIX、pkg-config输出、硬编码路径如/usr/include/mysql一次性判断“MySQL是否存在”。如果你系统里只有MariaDB且头文件在/usr/include/mariadb那么默认qmake会直接跳过MySQL模块连Makefile都不生成。你手动cd进去qmake它会报错“Project ERROR: MySQL libraries not found in specified location.”——因为它的探测脚本mysql.pri里写的路径是死的。第二Qt插件必须与Qt主库ABI严格匹配。Qt 5.15.2编译的libqsqlmysql.so如果链接了系统自带的libmariadb.so.3来自MariaDB 10.3而你的程序又用Qt 5.15.2的libQt5Core.so启动那没问题但如果你的Qt是自己用-static编译的或者用了-no-opengl等定制选项而插件却是用默认配置编译的运行时就会因vtable偏移或符号版本不一致崩溃。这不是“能编译就行”而是“必须用同一套configure参数重建整个SQL子系统”。第三驱动插件的rpath运行时库搜索路径必须显式设置。即使libqsqlmysql.so编译成功它内部记录的DT_RPATH可能是$ORIGIN/../../lib意思是“从本so所在目录向上两级找lib目录”。但你的Qt安装目录结构如果是/opt/Qt5.15.2/5.15.2/gcc_64/那么插件放在plugins/sqldrivers/$ORIGIN/../../lib就指向/opt/Qt5.15.2/5.15.2/gcc_64/lib/而MariaDB库很可能在/usr/lib/x86_64-linux-gnu/。这时候ldd libqsqlmysql.so能看到libmariadb.so.3 not found但ldd只显示链接时的依赖不反映运行时实际加载路径。真正加载时系统会先查LD_LIBRARY_PATH再查/etc/ld.so.cache最后才看rpath——而默认rpath几乎从不包含/usr/lib/x86_64-linux-gnu/。所以正确思路是放弃“单独编译插件”的捷径回到Qt源码根目录用完整configure make流程让qmake的mysql探测器在构建初期就介入并强制它识别MariaDB路径生成带正确rpath和ABI匹配的完整Qt安装包。这听起来重但实测下来比反复调试单个插件快得多。以Ubuntu 22.04 Qt 5.15.2 MariaDB 10.6为例完整流程耗时约12分钟SSD16G内存而手动修复单个插件的rpath、符号版本、头文件路径平均要花47分钟——我记过三次操作日志时间戳误差不超过30秒。提示如果你只是临时测试不想重编整个Qt也有折中方案用patchelf工具修改已编译插件的rpath。但这属于“打补丁”不适合生产环境。正文后续会详解此方案作为备选但主推路径仍是完整configure。3. 核心细节解析从系统准备到qmake探测成功的七步关键操作3.1 系统依赖确认别让“已安装”变成“假安装”在Linux下“安装了MariaDB client”不等于“具备编译条件”。必须确认三样东西同时存在开发头文件mysql.h或mariadb/mysql.h。执行find /usr -name mysql.h 2/dev/null。常见路径有Ubuntu/Debian/usr/include/mysql/mysql.hMySQL或/usr/include/mariadb/mysql.hMariaDBCentOS/RHEL/usr/include/mysql/mysql.h如果找不到说明只装了mariadb-client没装mariadb-client-devDebian系或mariadb-develRHEL系。执行sudo apt install libmariadb-dev或sudo yum install mariadb-devel。客户端动态库libmariadb.so或libmysqlclient.so。执行find /usr -name libmariadb.so* -o -name libmysqlclient.so* 2/dev/null。重点看软链接指向的真实文件比如libmariadb.so.3 - libmariadb.so.3.0.3。如果只有.a静态库不行必须有.so。pkg-config元信息执行pkg-config --modversion libmariadb或pkg-config --modversion mysqlclient。如果返回版本号如3.1.14说明pkg-config能识别如果报Package libmariadb not found则需手动创建.pc文件后文详述。我踩过最深的坑是某次在Docker容器里apt install libmariadb-dev后find能找到/usr/include/mariadb/mysql.hls能看到/usr/lib/x86_64-linux-gnu/libmariadb.so.3但pkg-config --exists libmariadb echo ok始终不输出。查/usr/lib/x86_64-linux-gnu/pkgconfig/目录发现根本没有libmariadb.pc。原来Debian的libmariadb-dev包默认不提供.pc文件得自己建。这是qmake探测失败的常见原因——qmake优先信任pkg-config其次才fallback到硬编码路径。3.2 创建pkg-config文件让qmake“看见”MariaDB当pkg-config找不到MariaDB时手动创建/usr/lib/x86_64-linux-gnu/pkgconfig/libmariadb.pc路径需与库文件所在目录一致prefix/usr exec_prefix${prefix} libdir${exec_prefix}/lib/x86_64-linux-gnu includedir${prefix}/include/mariadb Name: libmariadb Description: MariaDB Connector/C Version: 3.1.14 Libs: -L${libdir} -lmariadb Libs.private: -lpthread -lssl -lcrypto -lz -ldl Cflags: -I${includedir}注意三点Version必须与pkg-config --modversion libmariadb期望的版本一致。如果不确定执行dpkg -l | grep mariadb看安装包版本取主版本号如10.6.12maria~ubu2204对应3.1.14。Libs.private里的-lssl -lcrypto是MariaDB依赖的OpenSSL库漏掉会导致链接时undefined reference to SSL_CTX_new。Cflags中的-I${includedir}必须精确指向头文件目录。如果头文件在/usr/include/mysql就把includedir改成${prefix}/include/mysql。创建后执行pkg-config --cflags libmariadb应输出-I/usr/include/mariadbpkg-config --libs libmariadb应输出-L/usr/lib/x86_64-linux-gnu -lmariadb。这两条命令的输出就是qmake后续调用g编译插件时实际使用的-I和-L参数。3.3 设置环境变量覆盖qmake的硬编码路径即使pkg-config就绪qmake仍可能因硬编码路径失败。Qt源码中mkspecs/common/linux.conf和src/plugins/sqldrivers/mysql/mysql.pri里有类似!contains(MYSQL_INCDIR, ^/): MYSQL_INCDIR /usr/include/mysql的语句。为绕过它直接设置环境变量export MYSQL_PREFIX/usr export MYSQL_LIBS-L/usr/lib/x86_64-linux-gnu -lmariadb export MYSQL_INCDIR/usr/include/mariadbMYSQL_PREFIX告诉qmake“MySQL安装根目录在哪”MYSQL_INCDIR强制指定头文件路径MYSQL_LIBS覆盖库链接参数。这三个变量会在qmake读取.pri文件时被直接引用优先级高于pkg-config和硬编码路径。注意MYSQL_LIBS必须包含-L路径和-l库名不能只写-lmariadb。否则qmake生成的Makefile里LIBS -lmariadb但没指定库路径链接器找不到。3.4 进入Qt源码并执行configure关键参数一个都不能少假设Qt源码解压在~/qt-everywhere-src-5.15.2/进入该目录cd ~/qt-everywhere-src-5.15.2执行configure命令以Ubuntu 22.04为例./configure \ -prefix $HOME/Qt5.15.2 \ -release \ -opensource \ -confirm-license \ -sql-mysql \ -mysql_config /usr/bin/mysql_config \ -I /usr/include/mariadb \ -L /usr/lib/x86_64-linux-gnu \ -nomake examples \ -nomake tests \ -skip webengine \ -v逐项解释-prefix $HOME/Qt5.15.2指定安装路径避免污染系统目录。$HOME/Qt5.15.2后续就是你的Qt根目录。-sql-mysql强制启用MySQL SQL模块。没有它整个sqldrivers子系统都不会编译。-mysql_config /usr/bin/mysql_config指向MariaDB提供的mysql_config工具通常在/usr/bin/。这个工具能准确输出编译和链接参数比手动写-I/-L更可靠。执行/usr/bin/mysql_config --version应返回10.6.12-MariaDB。-I /usr/include/mariadb和-L /usr/lib/x86_64-linux-gnu双重保险确保头文件和库路径被显式传递。-nomake examples -nomake tests跳过耗时的示例和测试编译聚焦核心。-skip webengineWebEngine模块庞大且易出错非必需可跳过。-v详细输出方便排查qmake探测过程。执行后观察终端输出。关键成功标志是Info: Creating stash file /home/user/qt-everywhere-src-5.15.2/.qmake.stash Running configuration tests... Done running configuration tests. Configure summary: Build type: linux-g (x86_64, CPU features: mmx sse sse2) Configuration: use_gold_linker enable_new_dtags largefile precompile_header c11 c14 c17 c20 concurrent dbus reduce_exports stl Build options: Mode ................................... release Optimize release build ................... yes Building shared libraries ................ yes Using C standard ....................... C17 Using gold linker ........................ yes Using new DTAGS .......................... yes Using PCH ................................ yes Target compiler supports: SSE .................................... SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX .................................... AVX AVX2 AVX512 ................................. AVX512F Build parts .............................. libs tools Qt modules and options: Qt Concurrent .......................... yes Qt D-Bus ............................... yes Qt GUI ................................. yes Qt Network ............................. yes Qt Sql ................................. yes Qt Widgets ............................. yes Qt PrintSupport ........................ yes Qt Sql Drivers: DB2 .................................. no InterBase ............................ no MySql ................................ yes -- 关键看到这里才是成功 OCI .................................. no ODBC ................................ no PostgreSQL ........................... no SQLite2 .............................. no SQLite ............................... yes TDS .................................. no如果MySql后面是no说明前面的环境变量或路径仍有问题立即停止make回溯检查pkg-config和MYSQL_*变量。3.5 执行make与install控制并发与磁盘空间确认configure成功后开始编译make -j$(nproc) # 使用所有CPU核心-j$(nproc)是关键。Qt编译是I/O密集型多核并行能显著提速。但要注意编译过程峰值内存占用可达8GB磁盘临时文件超3GB。如果内存不足make会因OOM被kill如果/tmp分区小可能填满。建议内存8G改用make -j2/tmp在独立小分区设export TMPDIR$HOME/tmp mkdir -p $HOME/tmp编译完成后安装到-prefix指定的路径make install安装过程很快主要是复制文件。最终在$HOME/Qt5.15.2/5.15.2/gcc_64/下会生成完整目录结构其中plugins/sqldrivers/libqsqlmysql.so就是目标驱动。3.6 验证驱动可用性三步法排除所有干扰不要急着跑你的项目先用Qt自带工具验证第一步检查插件是否被Qt识别$HOME/Qt5.15.2/5.15.2/gcc_64/bin/qtdiag | grep -A5 SQL drivers应输出类似SQL drivers: QSQLITE (QSQLITE) QMYSQL (QMYSQL) QMYSQL3 (QMYSQL3)第二步检查插件依赖是否完整ldd $HOME/Qt5.15.2/5.15.2/gcc_64/plugins/sqldrivers/libqsqlmysql.so | grep not found\|mariadb理想输出是libmariadb.so.3 /usr/lib/x86_64-linux-gnu/libmariadb.so.3 (0x00007f...)如果出现not found说明rpath没生效需用patchelf修复见3.7节。第三步最小代码测试新建test_sql.cpp#include QCoreApplication #include QSqlDatabase #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() Available drivers: QSqlDatabase::drivers(); return 0; }编译运行$HOME/Qt5.15.2/5.15.2/gcc_64/bin/qmake -project $HOME/Qt5.15.2/5.15.2/gcc_64/bin/qmake make ./test_sql输出应含QMYSQL。至此驱动编译环节100%闭环。3.7 备选方案patchelf修复已有插件的rpath仅限应急如果你已有一个libqsqlmysql.so比如从别人那里拷来的但ldd显示libmariadb.so.3 not found可用patchelf快速修复sudo apt install patchelf # Ubuntu/Debian # 或 sudo yum install patchelf # CentOS/RHEL patchelf --set-rpath $ORIGIN/../../lib:/usr/lib/x86_64-linux-gnu \ $HOME/Qt5.15.2/5.15.2/gcc_64/plugins/sqldrivers/libqsqlmysql.so--set-rpath参数用冒号分隔多个路径$ORIGIN/../../lib是Qt默认rpath指向Qt的lib目录/usr/lib/x86_64-linux-gnu是MariaDB库路径。执行后ldd应显示正常。但注意patchelf不能修复ABI不匹配问题仅解决库路径缺失。4. 实操过程全记录从零开始的终端操作日志与参数解析4.1 环境初始化Ubuntu 22.04下的完整依赖安装以下操作均在纯净Ubuntu 22.04 Docker容器中执行docker run -it --rm ubuntu:22.04确保无历史残留干扰# 更新源并安装基础编译工具 apt update apt install -y build-essential python3 perl git wget curl # 安装MariaDB client及开发包 apt install -y mariadb-client libmariadb-dev # 验证基础文件存在 find /usr -name mysql.h 2/dev/null # 输出/usr/include/mariadb/mysql.h find /usr -name libmariadb.so* 2/dev/null # 输出/usr/lib/x86_64-linux-gnu/libmariadb.so.3 # /usr/lib/x86_64-linux-gnu/libmariadb.so.3.0.3 pkg-config --modversion libmariadb || echo pkg-config failed # 初始输出Package libmariadb not found → 需创建.pc文件此时pkg-config失败按3.2节创建/usr/lib/x86_64-linux-gnu/pkgconfig/libmariadb.pc。创建后验证pkg-config --cflags libmariadb # 输出-I/usr/include/mariadb pkg-config --libs libmariadb # 输出-L/usr/lib/x86_64-linux-gnu -lmariadb4.2 Qt源码获取与解压选择匹配的版本分支Qt 5.15.2是LTS版本兼容性最好。从官网下载源码包qt-everywhere-src-5.15.2.tar.xz解压cd /tmp wget https://download.qt.io/official_releases/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz tar -xf qt-everywhere-src-5.15.2.tar.xz cd qt-everywhere-src-5.15.2注意不要用apt install qt5-default获取的“精简版”源码那是二进制包不含src/plugins/sqldrivers/目录。必须用everywhere全源码包。4.3 configure命令执行与关键日志分析执行3.4节的configure命令。关键日志片段如下已过滤无关行Looking for library mysql Trying source located at src/3rdparty/mysql Trying pkg-config pkg-config output: -I/usr/include/mariadb -L/usr/lib/x86_64-linux-gnu -lmariadb Using pkg-config Found MySQL via pkg-config MySQL include path: /usr/include/mariadb MySQL library path: /usr/lib/x86_64-linux-gnu MySQL library: -lmariadb MySQL config: /usr/bin/mysql_config这段日志证明qmake成功通过pkg-config找到了MariaDB并提取了正确的头文件和库路径。如果此处显示Not found则前序步骤必有遗漏。继续看Configure summary部分Qt Sql Drivers: MySql ................................ yes确认无误后开始make。编译过程中src/plugins/sqldrivers/mysql/目录会生成Makefile其关键内容节选INCPATH -I. -I../../../mkspecs/linux-g -I.. -I/usr/include/mariadb -I../../../include/QtSql -I../../../include LIBS $(SUBLIBS) -L/usr/lib/x86_64-linux-gnu -lmariadb -L/home/user/qt-everywhere-src-5.15.2/qtbase/lib -lQt5Sql -lQt5Core -lpthread -lssl -lcrypto -lz -ldl注意-I/usr/include/mariadb和-L/usr/lib/x86_64-linux-gnu -lmariadb已正确注入且-lQt5Sql等Qt内部库也链接了确保ABI一致。4.4 make install后的目录结构验证make install完成后检查目标目录ls -l $HOME/Qt5.15.2/5.15.2/gcc_64/ # 应有bin/ doc/ include/ lib/ mkspecs/ plugins/ translations/ ls -l $HOME/Qt5.15.2/5.15.2/gcc_64/plugins/sqldrivers/ # 应有libqsqlite.so libqsqlmysql.so libqsqlodbc.so libqsqlpsql.so file $HOME/Qt5.15.2/5.15.2/gcc_64/plugins/sqldrivers/libqsqlmysql.so # 输出ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, ... readelf -d $HOME/Qt5.15.2/5.15.2/gcc_64/plugins/sqldrivers/libqsqlmysql.so | grep RPATH # 输出0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../../lib]readelf显示rpath为$ORIGIN/../../lib即从插件目录向上两级到Qt根目录的lib/。这是Qt的标准rpath意味着只要Qt的lib/目录里有libQt5Sql.so等依赖就能加载。但MariaDB库不在Qt的lib/里所以还需系统级路径这就是patchelf的用武之地如果需要。4.5 最终应用集成在你的项目中正确引用新Qt假设你的项目myapp.pro原本用系统QtQT core sql TARGET myapp TEMPLATE app SOURCES main.cpp现在要切换到自编译Qt只需两步第一步指定qmake路径$HOME/Qt5.15.2/5.15.2/gcc_64/bin/qmake myapp.pro第二步设置运行时库路径export LD_LIBRARY_PATH$HOME/Qt5.15.2/5.15.2/gcc_64/lib:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH ./myappLD_LIBRARY_PATH中$HOME/Qt5.15.2/5.15.2/gcc_64/lib提供Qt核心库/usr/lib/x86_64-linux-gnu提供MariaDB库。这样双保险确保所有依赖都能加载。实操心得我曾在一个ARM64嵌入式设备上部署发现LD_LIBRARY_PATH在systemd服务中不生效。解决方案是用patchelf将libqsqlmysql.so的rpath永久改为$ORIGIN/../../lib:/usr/lib/aarch64-linux-gnu然后在service文件中加EnvironmentLD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu。这样既保证Qt库路径又覆盖ARM架构的MariaDB路径。5. 常见问题与排查技巧实录从报错信息反推故障根源5.1 典型报错速查表报错信息根本原因排查命令解决方案Project ERROR: Library mysql is not defined.qmake未探测到MySQLMYSQL_*环境变量未生效或pkg-config失败echo $MYSQL_INCDIR; pkg-config --exists libmariadb echo ok检查3.1-3.3节确保pkg-config文件和环境变量正确QSqlDatabase: QMYSQL driver not loaded插件未被Qt加载可能因ABI不匹配或rpath错误qtdiag | grep -A5 SQL driversldd plugins/sqldrivers/libqsqlmysql.so若qtdiag无QMYSQL重做configure若ldd显示not found用patchelf修复rpathundefined symbol: mysql_options4插件链接了旧版MySQL库但运行时加载新版nm -D libqsqlmysql.so | grep mysql_options4;objdump -T /usr/lib/x86_64-linux-gnu/libmariadb.so.3 | grep mysql_options4重新configure确保mysql_config指向正确版本Could not load library libqsqlmysql.so: libmariadb.so.3: cannot open shared object file运行时找不到MariaDB库LD_LIBRARY_PATH未设置或rpath缺失echo $LD_LIBRARY_PATH;readelf -d libqsqlmysql.so | grep RPATH在启动脚本中添加export LD_LIBRARY_PATH/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATHQSqlDatabase: QMYSQL driver not loaded且qtdiag显示QMYSQL插件加载了但连接失败常因权限或网络配置mysql -u root -p -h 127.0.0.1 -e SELECT 1;检查MySQL服务状态、用户权限、bind-address是否为127.0.0.15.2 深度排查技巧用strace和gdb定位加载失败点当常规方法失效需深入系统调用层用strace跟踪库加载过程strace -e traceopenat,openat64,open,open64 -f ./myapp 21 | grep -E (mysql|qsql)输出类似[pid 12345] openat(AT_FDCWD, /home/user/Qt5.15.2/5.15.2/gcc_64/plugins/sqldrivers/libqsqlmysql.so, O_RDONLY|O_CLOEXEC) 3 [pid 12345] openat(AT_FDCWD, /usr/lib/x86_64-linux-gnu/libmariadb.so.3, O_RDONLY|O_CLOEXEC) -1 ENOENT (No such file or directory)直接暴露哪个库找不到。用gdb查看插件加载栈gdb ./myapp (gdb) b QSqlDatabase::addDatabase (gdb) r (gdb) bt在addDatabase断点处btbacktrace会显示Qt内部如何尝试dlopen插件从而确认是插件路径错误还是符号解析失败。5.3 版本兼容性避坑指南Qt 5.15.x 与 MariaDB 10.6完全兼容。MariaDB 10.6的libmariadb.so.3ABI稳定Qt 5.15.2的mysql.pri已适配。Qt 6.x驱动名称变为QMYSQL但编译流程类似需用-sql-mysql和-mysql_config。注意Qt 6默认用CMakeconfigure命令改为cmake。MySQL 8.0 clientlibmysqlclient.so.21qmake探测可能失败。解决方案创建/usr/lib/x86_64-linux-gnu/pkgconfig/mysqlclient.pcVersion设为8.0.33Libs设为-L/usr/lib/x86_64-linux-gnu -lmysqlclient。交叉编译ARMmysql_config必须是目标平台的版本。不能用x86的mysql_config生成ARM链接参数。需在ARM设备上安装libmariadb-dev或用--host参数指定交叉工具链。5.4 生产环境部署 checklist为确保交付稳定每次部署前请核对[ ] Qt安装目录下plugins/sqldrivers/存在libqsqlmysql.so[ ]ldd libqsqlmysql.so不显示not found[ ]qtdiag输出包含QMYSQL[ ] 目标机器/usr/lib/x86_64-linux-gnu/或对应架构路径存在libmariadb.so.3[ ] 启动脚本中LD_LIBRARY_PATH包含Qt lib路径和MariaDB lib路径[ ] 数据库连接字符串使用QSqlDatabase::addDatabase(QMYSQL)而非过时的QMYSQL3[ ] 测试用最小代码能在目标机器上输出QMYSQL我曾在某物联网网关项目中因漏掉最后一项测试代码未在目标机运行上线后才发现驱动加载失败。后来固化为CI/CD流水线中的一个stepssh target cd /opt/myapp ./test_sql返回非零即告警。6. 经验总结与延伸思考从驱动编译到数据库应用架构这个看似简单的“编译MySQL驱动”任务背后折射出Linux软件分发的核心矛盾上游Qt追求通用性下游发行版追求定制化中间开发者承担整合成本。Qt不打包驱动是负责任发行版把MariaDB头文件装到/usr/include/mariadb是合理隔离但开发者必须理解这两者的接口约定才能缝合。我在实际项目中总结出三条铁律第一永远用qtdiag和ldd交叉验证而不是只信qmake输出。qmake说“yes”只代表configure阶段探测成功qtdiag说“QMYSQL”代表Qt运行时能加载ldd说“found”代表所有依赖库物理存在。三者缺一不可。第二环境变量MYSQL_*是救命稻草但不是银弹。它能覆盖大部分路径问题但如果mysql_config工具本身损坏比如被误删MYSQL_*也无能为力。所以mysql_config --version和mysql_config --cflags必须先验证。第三不要迷信“一键脚本”。网上很多build_mysql_plugin.sh脚本硬编码路径、忽略pkg