• 交叉编译QT报错问题


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 历史是个迷 2024-04-23 00:24 采纳率: 0% 浏览 9 首页/ 编程语言 / 交叉编译QT报错问题 qtlinuxarm开发 使用韦东山的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 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 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)
        

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

      评论 编辑记录
    • 阿里嘎多学长 2024-04-23 00:24
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      问题概括

      这个问题是关于在STM32MP157 PRO板子上交叉编译Qt源码时遇到的链接错误。用户尝试使用韦东山的STM32MP157 PRO板子进行Qt的交叉编译,但在执行autoConfigure.sh后遇到了链接器错误,提示无法找到statxrenameat2函数的引用。

      问题出现原因

      根据提供的错误信息,问题出现在链接阶段,具体是因为:

      1. statx函数:这是Linux系统调用,用于获取文件状态信息。错误表明编译器找不到这个函数的定义。
      2. renameat2函数:这也是一个Linux系统调用,用于重命名文件。同样,编译器找不到这个函数的定义。

      这两个函数通常在较新的Linux内核版本中可用。如果交叉编译工具链或目标系统不支持这些调用,或者工具链没有正确配置以链接到包含这些调用的库,就会出现这样的错误。

      问题解决方案

      要解决这个问题,可以尝试以下步骤:

      1. 确认工具链兼容性:确保使用的交叉编译工具链支持这些系统调用。如果不支持,可能需要更新工具链或使用支持这些调用的版本。

      2. 检查内核版本:确认目标系统的Linux内核版本是否支持statxrenameat2。如果内核版本较旧,可能不支持这些调用。

      3. 修改Qt配置:如果目标系统确实不支持这些调用,可以尝试修改Qt的配置文件,禁用对这些功能的依赖。这可能需要修改qmake.conf文件,注释掉或删除与statxrenameat2相关的配置行。

      4. 联系Qt支持:如果上述步骤都无法解决问题,可以考虑联系Qt的技术支持或社区寻求帮助。

      提供代码

      由于这个问题涉及到系统级的环境配置和工具链设置,而不是简单的代码修改,因此没有特定的代码可以提供。主要的解决步骤是检查和调整工具链配置。

      示例代码运行方式

      由于这是一个环境配置问题,没有具体的代码示例。运行方式将涉及到设置正确的交叉编译环境,包括工具链、内核版本和Qt配置。

      示例代码预期运行结果

      如果问题得到解决,预期的结果是能够成功编译Qt源码,而不会遇到链接错误。这意味着autoConfigure.sh能够顺利执行,没有报错信息,最终生成可执行的Qt应用程序。

      请注意,解决这类问题通常需要对交叉编译和系统调用有较深的理解,可能需要一定的调试和尝试。如果不熟悉这些概念,寻求专业的技术支持可能是一个更好的选择。

      展开全部

      评论 编辑记录
      历史是个迷 2024-04-23 00:27

      求大佬帮助,太煎熬了不知道怎么解决

      回复
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-23 00:24
      关注

      上午好☀️☀️☀️️
      本答案参考ChatGPT-3.5

      分析:

      根据错误信息看,是在编译能过程中出现了一些链接错误,找不到对应的库文件,具体如下:

      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 tostatx' 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 torenameat2' collect2: error: ld returned 1 exit status

      解决方案:

      1.检查是否安装了目标板需要的依赖包,如:libssl、libcrypto等。

      2.检查编译时是否使用了正确的库文件路径。

      3.检查编译选项是否正确,包括静态库和动态库选项等。

      4.尝试使用其他版本的编译工具链进行编译。

      评论
    • GISer Liu 2024-04-23 00:40
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      这个报错信息显示了一些未定义的引用,这意味着链接器在尝试创建最终可执行文件时找不到相关的符号定义。针对这个问题,我会采取以下步骤:

      1. 理解报错信息
      • 报错信息中提到了两个未定义的符号:statxrenameat2
      • 这些符号通常是系统函数或库函数中的函数,它们可能在你的目标系统中缺失或者在你的交叉编译环境中不可用。
      1. 确认目标平台支持
      • 首先,确认你的目标平台(韦东山的STM32MP157 PRO板子)的操作系统是否支持这些函数。
      • 如果你的目标平台不支持这些函数,你需要修改代码以避免使用这些函数或者尝试在目标平台上实现相应的功能。
      1. 检查交叉编译环境
      • 确保你的交叉编译环境中包含了所需的头文件和库文件,以支持这些函数的使用。
      • 检查你的交叉编译工具链是否正确配置,并且包含了与这些函数相关的头文件和库文件。
      1. 修改配置
      • 如果你确定目标平台不支持这些函数,你可以尝试修改 Qt 的配置,禁用对这些函数的使用。例如,在 autoConfigure.sh 中添加选项 -no-feature-statx-no-feature-renameat2
      1. 搜索解决方案
      • 如果以上步骤没有解决问题,可以尝试搜索类似的问题,看看其他人是否遇到过类似的情况,并且找到了解决方案。
      • 在相关的开发者社区或论坛上发帖求助,或许会有其他开发者遇到过类似的问题并提供了解决方案。
        根据你的需求,我可以帮你编写修改配置文件的代码或者提供更多关于特定函数的信息。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Windows之应用安装程序 —— winget
    【Maven教程】(九):使用 Maven 进行测试 ~
    html之表格标签和列表标签
    基于DevExpress的GridControl实现的一些界面处理功能
    C 学生管理系统_分析
    【Pytorch深度学习实战】(5)卷积神经网络(CNN)
    MC9S12DP512VPVE、MC9S12DT512CPVE HCS12系列 微控制器 16位 闪存 112LQFP
    day16_List&Set课后练习题 - 参考答案
    VScode常用快捷键
    TorchScript学习使用
  • 原文地址:https://ask.csdn.net/questions/8093163