多 Qt 版本共存中 QGC 环境搭建踩坑记录(附一键脚本切换环境变量)

发布于:2025-07-17 ⋅ 阅读:(13) ⋅ 点赞:(0)

在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 文件替换,节省等待时间:

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到