Qt for OpenHarmony源码构建问题总结
Qt for OpenHarmony地址
Qt for OpenHarmony/zh - Qt Wiki
这上面大部分都有跟着步骤走,不行看HarmonyOS鸿蒙PC的QT应用开发:(一、开发环境搭建及第一个HelloWorld)_windows 开发鸿蒙qt应用-CSDN博客
这个博主的,注意细节
下面我在配置过程遇到问题总结
Qt 5.12.12 for HarmonyOS 配置问题总结
环境信息
源码:tqtc-qt5 (Qt 5.12.12,官方鸿蒙移植版)
工具链:LLVM MinGW (clang 23.1.1),用于编译 Qt 本身
交叉工具链:HarmonyOS NEXT NDK (llvm/clang),用于编译最终的 Qt 库
目标架构:arm64-v8a (HarmonyOS)
构建平台:Windows 10 (x86_64)
问题一:__EXCEPTIONS 宏未定义导致编译 qglobal.cpp 失败
现象:
qglobal.cpp 中有一段代码判断 __EXCEPTIONS 宏,如果未定义则跳过 #include <exception>。LLVM MinGW 的 clang 编译器不定义 __EXCEPTIONS 宏(GCC 会定义它),导致 <exception> 头文件未被包含,后续用到 std::exception 的地方全部报错。
解决办法:
修改 D:\oh\tqtc-qt5\qtbase\src\corelib\global\qglobal.cpp,将条件包含改成无条件包含:
// 原代码
#if defined(__EXCEPTIONS) && __EXCEPTIONS
# include <exception>
#endif
// 改成
#include <exception>
问题二:-fno-keep-inline-dllexport 编译选项不被 clang 识别
现象:
win32-g++/qmake.conf 中硬编码了 GCC 专用编译选项 -fno-keep-inline-dllexport。clang 不认识这个选项,报错退出。这个文件用于定义 Qt 配置阶段用的宿主编译器(host compiler)参数。
解决办法:
删除 D:\oh\tqtc-qt5\qtbase\mkspecs\win32-g++\qmake.conf 中的这一行:
QMAKE_CFLAGS_CXX11 += -fno-keep-inline-dllexport
改为空行或直接删除。
问题三:g++ -print-search-dirs 输出包含连续双分号 ;;,qmake 解析失败
现象:
配置阶段 qmake 会执行 g++ -print-search-dirs 获取编译器搜索路径。LLVM MinGW 的 clang 输出格式中路径分隔符出现了 ;;(连续双分号),而 qmake 按单分号 ; 拆分路径,导致解析失败,报错 "failed to parse default library paths from compiler output"。
解决办法:
编写一个 g++.bat 包装脚本,接管 LLVM MinGW 目录下的 g++ 命令。当检测到参数包含 -print-search-dirs 时,先执行真实的 clang 编译器获取输出,再用字符串替换将 ;; 替换为 ;,然后输出给 qmake。
@echo off
setlocal enabledelayedexpansion
set "ARGS=%*"
if not "!ARGS:-print-search-dirs=!"=="%ARGS%" (
for /f "delims=" %%i in ('"...\x86_64-w64-mingw32-g++.exe" -print-search-dirs') do (
set "LINE=%%i"
set "LINE=!LINE:;;=;!"
echo !LINE!
)
) else (
"...\x86_64-w64-mingw32-g++.exe" %*
)
将 g++.bat 放入 LLVM MinGW 的 bin 目录,并确保该目录在 PATH 中排在 Strawberry Perl(也包含一个 g++.exe)之前。
问题四:g++ -E -v -xc++ - 输出缺少 LIBRARY_PATH= 行,qmake 解析失败
现象:
配置阶段 qmake 还会执行 g++ -E -v -xc++ - 来获取编译器的详细搜索路径信息。GCC 在 stderr 上会输出一行 LIBRARY_PATH=路径1;路径2;...,但 clang 的 -E -v 输出中不包含这一行。qmake 找不到 LIBRARY_PATH 信息,报错 "failed to parse default search paths from compiler output"。
注意:这个问题是在修复了问题三之后才暴露出来的——先解决 ;; 问题后,qmake 能继续往下走了,但在下一个解析点又卡住了。
解决办法:
在 g++.bat 包装脚本中增加对 -E -v 参数的处理:当检测到参数包含 -E -v 时,在调用真实编译器之前,先向 stderr 输出一行格式正确的 LIBRARY_PATH=...,模拟 GCC 的行为。
echo %* | findstr /C:"-E -v" >nul 2>&1
if !errorlevel! equ 0 (
echo LIBRARY_PATH=D:/oh/llvm-mingw-.../lib/clang/23;...路径... 1>&2
"...\x86_64-w64-mingw32-g++.exe" %*
goto :EOF
)
关键是 1>&2 将这行输出重定向到 stderr,因为 qmake 读取的是编译器的 stderr 输出来获取搜索路径信息。
根本原因
所有四个问题的核心原因是同一个:Qt 5.12.12 的 configure/qmake 系统假设宿主编译器是 GCC,但实际使用的是 clang(LLVM MinGW)。两者在以下方面存在差异:
宏定义:GCC 定义 __EXCEPTIONS,clang 不定义
编译选项:GCC 特有的 flag 如 -fno-keep-inline-dllexport 不被 clang 支持
输出格式:-print-search-dirs 和 -E -v 的输出细节不同
这不是环境配置错误,也不是 Qt 版本太老,而是 源码对 clang 工具链的兼容性问题。Qt 6 已经不存在这些问题(完全重写了构建系统和编译器探测逻辑),但对于 Qt 5.12,需要通过以上四个补丁来适配。
更多推荐


所有评论(0)