把嘎嘎 2024-03-30 13:33 采纳率: 43.9%
浏览 144
已结题

交叉编译qt5.9.8configure出错

交叉编译qt5.9.8,编译器arm-linux-gnueabihf,修改qtbase\mkspecs\linux-arm-gnueabi-g++\qmake.conf,

#
# qmake configuration for building with arm-linux-gnueabihf-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-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

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

执行configure出错,ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-30 13:33
    关注

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

    在交叉编译Qt5.9.8时,可能会遇到以下问题:

    1. 已安装的依赖错误:如果你的系统已经安装了qtbase模块(用于构建Qt库),并且使用了arm-linux-gnueabihf作为目标平台,但是编译器出现了缺少某些特定库的错误,那么Qt5.9.8可能与qtbase相关的库文件发生冲突。

      • 错误消息:ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken

      • 解决方案: a. 首先确认你的系统已正确安装了qtbase模块。如果尚未安装,可以通过网络搜索并下载相应的包(例如qtbase-x86_64-linux-gnu.tar.gz)进行安装。 b. 更新qtbase模块到最新版本(例如从5.7.27升至5.9.0)。在终端输入以下命令更新qtbase模块:

        sudo apt-get update && sudo apt-get upgrade qtbase-x86_64-linux-gnu
        
      • 如果仍发现缺失某个库的错误,检查是否引用了包含这些库的源文件或头文件,例如在Qt的.cpp文件中导入了这些库的函数或类。确保没有手动引入它们,并且它们没有被其他地方引用或覆盖。

      • 在Qt的config.h文件中添加相应的头文件引用,例如:

        #include <QtCore/qglobal.h>
        
      • 在QT5.9.0或更高版本中重新编译Qt5.9.8,将qtbase替换为新的源文件或头文件路径,以便添加所需库。例如,在Qt 5.9.0的setup.sh脚本中,可以将qtbase的路径设置为新的源文件路径:

        ./configure --enable-languages=c++,c++o \
                      --prefix=/path/to/new/qtbase \
                      --target=aarch64-linux-gnu --disable-static
        
    2. 编译器版本冲突:有时,arm-linux-gnueabihf-gcc编译器与Qt5.9.8使用的不同版本可能会导致编译错误。在尝试编译Qt5.9.8时,可以检查编译器是否具有必要的移植工具链、语法选项或库支持。

      • 错误消息:ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken

      • 解决方案: a. 确保编译器版本符合Qt5.9.8的编译要求。你可以在Qt官方文档中找到有关编译器版本信息的指南,查看是否提供了编译器与Qt5.9.8兼容所需的最低版本。通常情况下,编译器应至少支持g++ >= 5.3

        b. 在交叉编译过程中切换到编译器的对应版本。通常,arm-linux-gnueabihf-gcc应该指向与Qt5.9.8相同的编译器版本(例如gcc-aarch64-linux-gnu)。例如,如果你使用的是Ubuntu,可以运行以下命令在编译器目录中查找并切换到gcc-aarch64-linux-gnu

        cd /usr/bin/gcc-avr
        ./configure --enable-languages=c++,c++o \
                     --prefix=/usr/local/extra/gcc-avr \
                     --target=aarch64-linux-gnu --disable-static
        
    3. 模块依赖未满足:Qt5.9.8包含多个模块,每个模块都依赖于一些特定的库。编译时,如果找不到正确的库依赖关系或指定的库版本,可能导致编译失败。

      • 错误消息:ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken

      • 解决方案: a. 查看Qt5.9.8的依赖列表,了解所有必需的库及其版本。这通常会列出Qt5.9.8通过qxx-config提供的依赖关系列表。 b. 根据依赖列表确定所需的库文件路径。这些路径应位于Qt5.9.8的lib目录中,并且是按照qxx-config生成的链接符号列表编写的。例如,假设Qt5.9.8的lib目录位于~/local/qt5.9.8/lib,则正确路径可能是:

        ```bash
        ~/local/qt5.9.8/lib:$QT5.9.8/usr/lib/qt5.9.8/lib:$QT5.9.8/usr/lib/qt5.9.8/lib/main
        ```
        

        c. 使用编译器的配置选项指定所需的库文件路径。例如,对于arm-linux-gnueabihf-gcc编译器,可以在--libs选项中列出要包含的库文件:

        ```bash
        arm-linux-gnueabihf-gcc --libs $(find ~/local/qt5.9.8/lib -name "*.so" -type f | xargs -I {} libquadcore.a) --linkshared --library-path=$QT5.9.8/usr/lib/qt5.9.8/lib
        ```
        

      d. 安装和编译所需要的库文件。你需要将上述路径添加到Makefileconfigure.ac文件中,然后使用编译器命令行参数--build-zlib来指定包含指定库的.zlib源文件,例如:

        ```bash
        mkdir build
        cd build
        make install-zlib
        ```
      
    4. 系统资源不足:交叉编译需要大量的系统资源,包括内存、处理器时间等。如果您的系统资源有限,可能会导致编译失败。以下是一些解决方法:

      • 增加系统内存:在交叉编译时,Qt5.9.8会自动创建一个包含整个Qt库的building directory。为了确保有足够的可用内存来编译整个项目,您可以选择增加系统中的RAM或升级现有系统。

      • 调整编译参数:交叉编译器通常使用一种名为--with-g ++ -stdlib=libstdc++的选项来处理库文件,从而提供足够的共享内存空间。如果您想优化编译性能或只编译部分库,可以考虑使用--with-g++选项,并指明您想要编译的库文件路径。例如,对于arm-linux-gnueabihf-gcc编译器,可将其设置为--with-g++ -stdlib=libstdc++

        ```bash
        arm-linux-gnueabihf-gcc --with-g++ -stdlib=libstdc++ --prefix=/path/to/new/qtbase --target=aarch64-linux-gnu --disable-static
        ```
        
      • 减少生成的文件数量:在交叉编译时,Qt5.9.8会创建多个生成文件,包括.so、.a、.o、lib文件以及头文件等。减少生成文件的数量有助于降低编译过程的占用内存。例如,如果您不打算编译Qt库本身,可以选择忽略或删除生成的所有 .so 文件:

        ```bash
        make clean
        ```
        
    5. 缓存文件未清理:在使用--with-g++选项编译时,有时可能会创建或修改系统缓存文件。这可能导致编译错误,特别是在多次交叉编译同一项目后,缓存文件不再匹配先前的编译结果,导致后续编译失败。确保在每次交叉编译完成后清空系统缓存文件,例如:

        ```bash
        rm -rf ~/.cache/qmake || true
        rm -rf ~/.cache/qtbase || true
        rm -rf ~/.cache/*.a || true
        rm -rf *.so || true
        rm -rf ./.libs || true
        ```
      
    6. 编译器选项无效:交叉编译过程中,有时会出现编译器选项无效的情况。例如,如果您选择了在编译时仅编译所需的库文件而不包括其依赖的外部库,可能导致编译错误或缺少依赖库时也无法构建Qt应用程序。请确保在交叉编译过程中包含了所有必要的库文件及其依赖,并遵循Qt的头文件规范(例如qxx-config)定义的链接规则。

      • 错误消息:ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken

      • 解决方案: a. 逐个检查和排除编译选项无效的问题。确保在交叉编译时同时包含所有必需的库文件及其依赖,并检查编译选项的正确性。例如,如果编译器的--target选项指向编译器自身,但提供了多余的-f选项,应去掉或更改其中的部分。在Qt的config.h文件中,你可以看到像#define QT_VERSION 5.9.8这样的定义,这意味着Qt5.9.8的目标版本是5.9.8而不是5.7.27。

        b. 使用Qt库自带的configure命令和对应的参数进行编译。例如,在Qt 5.9.0的configure脚本中,如果有额外的--with-foo选项,只需将其替换为实际的库名(例如-Wl, -rpath:/path/to/your/library),并根据Qt头文件的描述编写链接规则(例如`-L/path

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 修改了问题 3月30日
  • 创建了问题 3月30日