You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt开源版交叉编译gmake阶段失败求助

Qt交叉编译pcre2模块编译失败求助

正在交叉编译Qt开源版本,configure命令执行正常,但执行gmake时,qtbase/src/3rdparty/pcre2模块出现编译失败。确认已包含pthread.h且该头文件定义了PTHREAD_MUTEX_INITIALIZER宏,同时sys/mman.h文件也存在于指定sysroot路径中,且其他子项目编译正常,求修复建议。

编译报错信息

gmake[3]: Entering directory '/root/raspi/qt-build/qtbase/src/3rdparty/pcre2'
/root/raspi/arm-gnu-toolchain-12.2.mpacbti-rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc -c -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8 --sysroot=/root/raspi/sysroot -O2 -fPIC -std=gnu11 -fvisibility=hidden -w -fno-exceptions -DQT_NO_LINKED_LIST -DQT_NO_JAVA_STYLE_ITERATORS -DPCRE2_CODE_UNIT_WIDTH=16 -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DHAVE_CONFIG_H -DQT_NO_DYNAMIC_CAST -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2 -I. -I/root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2/src -I/root/raspi/qt-everywhere-src-5.15.9/qtbase/mkspecs/devices/linux-rasp-pi3-g++ -o .obj/pcre2_jit_compile.o /root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2/src/pcre2_jit_compile.c
In file included from /root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2/src/sljit/sljitLir.c:260,
                 from /root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2/src/pcre2_jit_compile.c:79:
/root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2/src/sljit/sljitUtils.c:41:41: error: 'PTHREAD_MUTEX_INITIALIZER' undeclared here (not in a function)
   41 | static pthread_mutex_t allocator_lock = PTHREAD_MUTEX_INITIALIZER;
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
/root/raspi/qt-everywhere-src-5.15.9/qtbase/src/3rdparty/pcre2/src/sljit/sljitUtils.c:77:10: fatal error: sys/mman.h: No such file or directory
   77 | #include <sys/mman.h>

引发第一个错误的源文件片段

#include <pthread.h>
static pthread_mutex_t allocator_lock = PTHREAD_MUTEX_INITIALIZER;

相关头文件的实际位置

[root@fedora qt-build]# find /root/raspi -name mman.h | grep sys
/root/raspi/sysroot/usr/include/aarch64-linux-gnu/asm/mman.h
/root/raspi/sysroot/usr/include/aarch64-linux-gnu/bits/mman.h
/root/raspi/sysroot/usr/include/aarch64-linux-gnu/sys/mman.h
/root/raspi/sysroot/usr/include/asm-generic/mman.h
/root/raspi/sysroot/usr/include/linux/mman.h
/root/raspi/qt-everywhere-src-5.15.9/qtwebengine/src/3rdparty/chromium/third_party/crashpad/crashpad/compat/android/sys/mman.h
/root/raspi/qt-everywhere-src-5.15.9/qtwebengine/src/3rdparty/chromium/third_party/crashpad/crashpad/compat/linux/sys/mman.h
[root@fedora qt-build]# find /root/raspi -name pthread.h
/root/raspi/sysroot/usr/include/pthread.h
/root/raspi/arm-gnu-toolchain-12.2.mpacbti-rel1-x86_64-arm-none-eabi/arm-none-eabi/include/pthread.h

修复建议

1. 补全pthread宏定义

PTHREAD_MUTEX_INITIALIZER需要在定义_POSIX_C_SOURCE(值≥199506L)或_GNU_SOURCE宏后才会被pthread.h暴露。可以:

  • 重新执行configure时添加编译参数:-extra-cflags="-D_POSIX_C_SOURCE=199506L"
  • 或者直接修改sljitUtils.c,在包含pthread.h前添加宏:
    #define _POSIX_C_SOURCE 199506L
    #include <pthread.h>
    

2. 修复sys/mman.h路径识别

从文件位置看,sys/mman.h在aarch64-linux-gnu子目录下,交叉编译器可能未自动搜索该路径:

  • 手动创建软链接,让编译器能直接找到:
    ln -s /root/raspi/sysroot/usr/include/aarch64-linux-gnu/sys/mman.h /root/raspi/sysroot/usr/include/sys/mman.h
    
  • 或者在configure时添加额外包含路径:-extra-cflags="-I/root/raspi/sysroot/usr/include/aarch64-linux-gnu"

3. 禁用pcre2的JIT编译

如果上述方法无效,可直接跳过JIT相关代码编译:

  • 重新configure时添加参数:-no-pcre-jit

4. 检查工具链与sysroot的匹配性

你使用的arm-none-eabi-gcc通常用于裸机开发,而sysroot是针对aarch64-linux-gnu的树莓派3(64位),存在架构工具链不匹配问题。更换为aarch64-linux-gnu-gcc工具链后,重新执行configure和编译。

内容的提问来源于stack exchange,提问作者TSG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:57:55