历史是个迷 2024-04-23 00:24 采纳率: 0%
浏览 35

交叉编译QT报错问题

使用韦东山的STM32MP157 PRO板子然后,交叉编译QT源码时,使用arm-buildroot-linux-gnueabihf-g++、arm-buildroot-linux-gnueabihf-gcc工具链,配置好autoConfigure.sh、qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf如下图所示,然后./autoConfigure.sh后就报错:如下图所示,打开对应的cpp后,头文件也都有,实在是找不到原因了,求帮助(韦东山板子移植qt的教程也没出,交流群问也没技术支持回答)

报错信息:

qfilesystemengine_unix.o: In function `qt_real_statx(int, char const*, int, statx*)':
/home/book/qt/qt-everywhere-src-5.14.2/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:311: undefined reference to `statx'
qfilesystemengine_unix.o: In function `QFileSystemEngine::renameFile(QFileSystemEntry const&, QFileSystemEntry const&, QSystemError&)':
/home/book/qt/qt-everywhere-src-5.14.2/qtbase/src/corelib/io/qfilesystemengine_unix.cpp:1228: undefined reference to `renameat2'
collect2: error: ld returned 1 exit status
Makefile:192: recipe for target '../bin/qmake' failed
make: *** [../bin/qmake] Error 1

qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC                = arm-buildroot-linux-gnueabihf-gcc-8.4.0
QMAKE_CXX               = arm-buildroot-linux-gnueabihf-g++
QMAKE_LINK              = arm-buildroot-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-buildroot-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-buildroot-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-buildroot-linux-gnueabihf-objcopy
QMAKE_NM                = arm-buildroot-linux-gnueabihf-nm -P
QMAKE_STRIP             = arm-buildroot-linux-gnueabihf-strip
load(qt_config)

**autoConfigure.sh**

#! /bin/sh
./configure \
-v \
-prefix /opt/qt-5.14.2 \
-release \
-opensource \
-no-accessibility \
-make libs \
-xplatform arm-buildroot-linux-gnueabihf-gcc-8.4.0 \
-optimized-qmake \
-pch \
-qt-zlib \
-qt-freetype \
-tslib \
-skip qtlocation \
-no-iconv \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-pkg-config \
-no-separate-debug-info \
-I/opt/tslib1.22/include -L/opt/tslib1.22/lib

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 00:24
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的报错信息来看,编译过程中遇到了两个未定义的引用:statxrenameat2。这通常意味着编译器在链接阶段没有找到提供这些函数的库。这两个函数是Linux内核提供的,用于更高级别的文件操作。

    解决这个问题,你需要确保链接了包含这些函数的库。对于statx,它可能在libc的某个特定版本中引入,而对于renameat2,这个函数是在glibc 2.26中引入的。因此,检查您的buildroot环境中的glibc版本是否足够新,以及是否正确链接了库。

    针对您的情况,可以尝试以下几个步骤来解决问题:

    1. 检查glibc版本: 运行命令确认glibc版本:

      arm-buildroot-linux-gnueabihf-gcc --print-file-name=libgcc.a | xargs readelf -d | grep GLIBC_2.26
      

      如果输出结果中包含了GLIBC_2.26,那么恭喜,你的glibc版本足够新。如果没有,可能需要升级buildroot环境中的glibc。

    2. 确保链接了正确的库: 在qmake.conf文件中添加相应的链接选项,强制链接可能缺失的库。在文件末尾添加以下内容:

      LIBS += -lrt -ldl
      
    3. 更新构建脚本: 在autoConfigure.sh中,添加额外的链接选项,确保链接到rtdl库:

      ./configure \
       ...
       -L/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib \
       -Wl,-rpath=/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib \
       -lrt -ldl
      
    4. 重新运行构建过程: 删除已有的构建产物,清理并重新开始构建:

      make clean
      ./autoConfigure.sh
      make -j$(nproc)
      

    如果上述步骤还不能解决问题,建议检查您的系统中是否有其他影响链接的设置,比如环境变量或链接顺序。如果问题依然存在,可能需要进一步分析编译器的链接选项和系统库路径,或者联系更专业的嵌入式开发社区寻求帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月23日

悬赏问题

  • ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
  • ¥60 找人回答kibana8.14.3二次集成开发,自定义插件ui导航栏如何设置
  • ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零
  • ¥15 不同模型怎么用同一个shader
  • ¥15 安卓启动没有ais proxy与v4l2的log打印
  • ¥15 go怎么读取mdb文件里面的数据
  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作
  • ¥15 脱敏项目合作,ner需求合作
  • ¥30 Matlab打开默认名称带有/的光谱数据