C++ 从源代码为ARM交叉编译Qt4.7时出现的问题

C++ 从源代码为ARM交叉编译Qt4.7时出现的问题,c++,linux,qt,embedded,arm,C++,Linux,Qt,Embedded,Arm,我正在尝试从源代码交叉编译Qt 4.7.1,以下是关于我的设置的一些说明: 我的预期输出是运行Qt应用程序所需的共享对象库 我的目标平台是采用ARM Cortex-A8架构的TI AM335x处理器 我的开发平台是x86 64位Ubuntu虚拟机 我对这应该如何工作的理解是,我下载了我的目标平台的工具链(这是TI的工具链),我下载了的源代码,我设置了mkspec以使用我的工具链,运行configure,然后只需要运行make/makeinstall,我就可以找到所有的。所以就是我告诉它安装到的地

我正在尝试从源代码交叉编译Qt 4.7.1,以下是关于我的设置的一些说明:

  • 我的预期输出是运行Qt应用程序所需的共享对象库
  • 我的目标平台是采用ARM Cortex-A8架构的TI AM335x处理器
  • 我的开发平台是x86 64位Ubuntu虚拟机
  • 我对这应该如何工作的理解是,我下载了我的目标平台的工具链(这是TI的工具链),我下载了的源代码,我设置了mkspec以使用我的工具链,运行
    configure
    ,然后只需要运行
    make
    /
    makeinstall
    ,我就可以找到所有的
    。所以
    就是我告诉它安装到的地方。然而,要让这个想法发挥作用,我遇到了很多问题


    首先,我下载了TI SDK版本:TI-SDK-am335x-evm-06.00.00.00,该版本的arm工具位于:
    [root\u install\u dir]/linux devkit/sysroot/i686 arago linux/usr/bin

    我用该目录更新了我的
    $PATH

    mike@mike-VirtualBox:~$echo$PATH /home/mike/ti-sdk-am335x-evm-06.00.00.00/linux-devkit/sysroot/i686-arago-linux/usr/bin :/usr/local/Trolltech/Qt-4.8.5/bin:/home/mike/bin:/usr/lib/lightdm/lightdm: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/mike/bin

    然后,我根据最接近的示例创建了自己的mkspec:
    cp-R[qt\u安装目录]/mkspecs/qws/linux-arm-gnueabi-g++/[qt\u安装目录]/mkspecs/qws/linux-am335x-g++

    我修改了
    linux-am335x-g++/qmake.conf
    以指向TI sdk中的工具:

    # 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_STRIP             = arm-linux-gnueabihf-strip
    
    然后我运行了一个configure命令:

    -no-pch
    
    ./configure-prefix/home/mike/qt4.7.1_source/my_qt-embedded arm-platform qws/linux-x86_64-g++-xpplatform qws/linux-am335x-g++-no-mmx-no-3dnow-no-sse-no-sse2-no-glib-no-cups-no-largefile-no-accessibility-no-openssl-no-gtkstyle-fast-opensource

    它运行了一段时间,然后完成,并说它准备好执行
    make
    /
    make install
    ,此时我运行
    make
    ,这就是它开始失败的地方:

    /home/mike/qt4.7.1_source/qt-everywhere-opensource-src-4.7.1/bin/moc -DQT\u共享-DQT\u构建\u核心\u库-DQT\u不使用\u名称空间-DQT\u不使用\u转换为\u ASCII-DQT\u转换警告-DQT3\u支持-DQT\u MOC\u兼容-DQT\u使用\u快速操作符+DQT\u使用\u快速连接-DELF\u解释器=“/lib64/ld-linux-x86-64.so.2”-DHB_EXPORT=Q_CORE_EXPORT-DQT_HAVE_NEON-DQT_NO_DEBUG-I..//mkspecs/qws/linux-am335x-g++-I..//include-I..//include-I..//QtCore-I.rcc/release-shared-emb-arm-Iglobal-I../3rdparty/haruzfbz/src-I../3rdparty/md5-I../3rdparty/md4-I.moc/release-shared-emb-arm kernel/qobject.h-o-moc/release-emb-qob-armarm-linux-gnueabihf-g++-c -include.pch/release shared emb arm/QtCore-pipe-fno exceptions-mfpu=neon-O2-fvisibility=hidden-fvisibility inlines hidden-Wall-W-D_REENTRANT-fPIC-DQT_shared-DQT_-BUILD_CORE_LIB-DQT_NO_使用名称空间-DQT_-NO-CAST-TO-ASCII-DQT-DQT-ASCII-DQT-ASCII-DQT_-ASCII_-CAST_警告-DQT_支持-DQT_-MOC-COMPAT-DQT使用快速运算符加上-DQT连接-DELF_解释器=\“/lib64/ld-linux-x86-64.so.2\”-DHB_EXPORT=Q_CORE_EXPORT-DQT_HAVE_NEON-DQT_NO_DEBUG-I..//mkspecs/qws/linux-am335x-g++-I..//include-I..//include/QtCore-I.rcc/release-shared-emb-arm-Iglobal-I../3rdparty/haruzfbz/src-I../3rdparty/md5-I../3rdparty/md4-I.moc/release-shared-emb-arm-o.release-shared-emb-arm-o.qobj/release-emb-arm/qobect.o/cpp内核标准:汇编程序消息:
    {standard input}:1294:错误:所选处理器不支持拇指模式“swp r6,r4,[r3]”
    make[1]:[.obj/release shared emb arm/qobject.o]错误1*
    make[1]:离开目录
    “/home/mike/qt4.7.1_source/qt-everywhere-opensource-src-4.7.1/src/corelib”
    make:[sub-corelib-make_default-ordered]错误2

    所以,问题是。。。 为什么编译器抱怨不支持thumb模式?因为这是基于ARM处理器的交叉编译工具链,所以应该支持它。事实并非如此,这让我觉得
    make
    在某种程度上选择了错误的g++

    有没有关于什么地方出了问题以及如何解决这个问题的想法

    {standard input}:1294:错误:所选处理器不支持拇指模式“swp r6、r4、[r3]”

    为什么编译器抱怨不支持thumb模式

    注意,编译器抱怨
    swp
    指令不能用于thumb模式。您的CPU支持thumb、thumb2和ARM。Cortex系列不推荐使用
    swp
    ,更喜欢
    ldrex/strex

    有没有关于什么地方出了问题以及如何解决这个问题的想法

    您需要让gcc来定义
    \uuuuuuu ARM\uuuu ARCH\uuuuuuuu
    ;这可以通过
    -mcpu=cortex-a8
    或组合
    -mtune=cortex-a8
    -march=armv7-a
    完成,或者根据您希望运行Qt的板的类型来完成

    有关选择子文件的详细信息,请参见。您选择了一个非常通用的ARM(我猜),因此您可以看到Note1,在那里您可以看到第125行附近的代码。CPU的正确文件是qatomic_armv7.h,它主要包括。在这个文件中,您可以找到
    ldrex/strex
    ,这是您的
    gcc
    所要求的有益健康的东西

    我还建议您不要使用-fast编译。OP说这解决了他的问题;但我认为这是不同的

    您可以尝试传递
    -armfpa
    进行配置
    /configure-embedded arm--help
    很有用<代码>配置
    似乎选择了霓虹灯,因此它似乎知道您有更高级的CPU(电脑上没有霓虹灯)
    asm volatile("swpb %0,%1,[%2]"
                 : "=r"(ret)
                 : "0"(newval), "r"(ptr)
                 : "memory");
    
    QMAKE_CFLAGS= -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8
    QMAKE_CXXFLAGS= -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8
    
    -no-pch