文章目录
在Qt 5.12.6. 与 Qt 5.15.2 环境下开发 QGC 应用时,遇到了不少的,这里做一下记录,供有相同需求的同学参考。
🧩 问题一:链接时报 relocation 错误
环境:qt 5.15.2 Android 下
❗ 错误信息
ld: error: relocation R_AARCH64_ADR_PREL_PG_HI21 cannot be used against symbol 'ff_cos_32'; recompile with -fPIC
>>> defined in .../gstreamer-1.0-android-universal-1.18.5/arm64/lib/libavcodec.a(fft_float.o)
>>> referenced by asm.S:491 (.../libavutil/aarch64/asm.S:491)
>>> fft_neon.o:(fft32_neon) in archive
```shell
ld: error: relocation R_AARCH64_ADD_ABS_LO12_NC cannot be used against symbol 'ff_cos_32'; recompile with -fPIC
✅解决办法: 使用 21.3 的 ndk
将 NDK 版本更换为 21.3,重新编译即可。
📝 使用较新版本的 NDK(如 r23 或更高)可能不兼容一些预编译的 .a 库(如 GStreamer、FFmpeg),建议回退到 21.3 版本进行兼容性调试。
示意图:
🧩 问题二:Qt 项目 Kit 无法解析
环境:qt 5.15.2 或者 qt 5.12.6
❗ 错误信息
Cannot parse project "qgroundcontrol": No kit selected.
Cannot parse project "qgroundcontrol": The currently selected kit "Desktop Qt 5.12.6 MSVC2017 64bit" does not have a valid Qt.
✅ 解决办法1
删除 Qt Creator 的配置缓存
C:\Users\用户名\AppData\Roaming\QtProject
这个缓存文件有时会导致 Kit 配置无法识别或 Qt Creator 启动缓慢。
✅ 解决办法2
再次遇到此问题,办法1失效;
后发现 git clone 后重新编译能绕过此问题,我是直接使用拷贝的程序。
🧩问题三:程序运行时报 “无法定位程序输入点”
环境: QT 5.12.6
❗ 错误截图
🕵️♂️ 问题分析
编译生成的 .exe 缺少 Qt 动态库(如 Qt5Locationd.dll),并且复制的 DLL 是 Qt 5.15.2 的,而当前项目用的是 Qt 5.12.6,导致符号无法匹配。
从 .pri 文件中可以看到使用了如下指令:
QMAKE_POST_LINK += $$escape_expand(\\n) $$QT_BIN_DIR\\windeployqt --qmldir=$${SOURCE_DIR}\\src $${DEPLOY_TARGET}
实际执行命令也没错:
C:/Qt/Qt5.12.6/5.12.6/msvc2017_64/bin\windeployqt --qmldir=E:/21_GCS/src staging\scGcs.exe
但仍然出现错误。
✅ 解决方法1
在 windeployqt 命令中添加 --no-patchqt 参数,避免其尝试修改 Qt DLL 内部路径,保持原始状态即可。
QMAKE_POST_LINK += $$escape_expand(\\n) $$QT_BIN_DIR\\windeployqt --no-patchqt --qmldir=$${SOURCE_DIR}\\src $${DEPLOY_TARGET}
💡 含义:跳过 patch DLL 操作,windeployqt 只负责复制文件,不修改路径信息。
✅ 解决方法2
如下,不同版本设置不同环境变量:
重启 qt creator
每次这样麻烦,可增加个脚本一键切换环境变量:
新建文本,改后缀为.bat
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
:: === Qt 安装路径 ===
set QT512=C:\Qt\Qt5.12.6\5.12.6\msvc2017_64
set QT515=C:\Qt\Qt5.15.2\5.15.2\msvc2019_64
:MENU
cls
echo ===============================
echo Qt 环境切换器(用户级)
echo ===============================
echo.
echo 1. 切换到 Qt 5.12.6
echo 2. 切换到 Qt 5.15.2
echo 3. 查看当前 Qt 环境
echo 0. 退出
echo.
set /p choice=请输入选项 [0-3]:
if "%choice%"=="1" call :SetQtEnv "!QT512!" "5.12.6" & pause & goto MENU
if "%choice%"=="2" call :SetQtEnv "!QT515!" "5.15.2" & pause & goto MENU
if "%choice%"=="3" call :ShowQtEnv & pause & goto MENU
if "%choice%"=="0" exit
goto MENU
:: === 设置 Qt 环境变量(自动清理旧 Qt 项)===
:SetQtEnv
set QT_DIR=%~1
set QT_VER=%~2
echo.
echo 正在切换到 Qt %QT_VER% ...
echo 当前 Qt 路径: %QT_DIR%
:: 1. 获取当前用户 PATH(而不是当前会话)
for /f "tokens=2*" %%a in ('reg query HKCU\Environment /v PATH 2^>nul') do set ORIG_PATH=%%b
:: 2. 拆分并清理掉旧 Qt 项(匹配 qt、Qt 不区分大小写)
set CLEAN_PATH=
for %%p in (%ORIG_PATH:;= %) do (
echo %%p | findstr /I /R "qt" >nul
if errorlevel 1 (
set CLEAN_PATH=!CLEAN_PATH!;%%p
)
)
:: 去除开头多余的分号
if "!CLEAN_PATH:~0,1!"==";" set CLEAN_PATH=!CLEAN_PATH:~1!
:: 3. 构建新 PATH
set NEW_PATH=%QT_DIR%\bin;%QT_DIR%\qml;!CLEAN_PATH!
:: 4. 设置环境变量
setx PATH "!NEW_PATH!"
setx QML_IMPORT_PATH "%QT_DIR%\qml"
echo ✅ 已成功切换到 Qt %QT_VER%
goto :eof
:: === 显示当前 Qt 路径 ===
:ShowQtEnv
echo.
echo 当前 QML_IMPORT_PATH: %QML_IMPORT_PATH%
echo 当前 PATH 中 Qt 部分:
echo %PATH% | findstr /I "qt"
goto :eof
双击运行:
选择 1:
环境变量中查看:
已经修改;
注意记得删除 build 下目录再编译;
💡 其他经验分享
📥 Gradle 下载过慢
下载 gradle 文件替换,节省等待时间: