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
相关产品推荐
相关产品推荐

