从源代码交叉编译Qt 4.7的问题

时间:2014-01-21 20:50:24

标签: c++ linux qt embedded arm

我正在尝试从源代码交叉编译Qt 4.7.1,这里有一些关于我的设置的注释:

  1. 我的预期输出是为了运行Qt应用程序而必须存在的共享对象库。
  2. 我的目标平台是采用ARM Cortex-A8架构的TI AM335x处理器。
  3. 我的开发平台是x86 64位Ubuntu虚拟机
  4. 我对这应该如何工作的理解是我下载了我的目标平台的工具链(这是来自TI的Linaro工具链),我下载了Qt 4.7.1的源代码,我设置了mkspec要使用我的工具链,请运行configure,然后只需运行make / make install,我就能找到我告诉它的所有.so安装到。然而,我有很多问题让这个想法发挥作用。


    首先我下载了​​TI SDK版本:ti-sdk-am335x-evm-06.00.00.00,其中包含arm工具: [root_install_dir]/linux-devkit/sysroots/i686-arago-linux/usr/bin

    我使用该目录更新了$PATH

      mike @ mike-VirtualBox:〜$ echo $ PATH   的 /home/mike/ti-sdk-am335x-evm-06.00.00.00/linux-devkit/sysroots/i686-arago-linux/usr/bin   :/usr/local/Trolltech/Qt-4.8.5/bin:/家庭/麦克/斌:/ usr / lib中/ lightdm / lightdm:   在/ usr / local / sbin中:在/ usr / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:/首页/麦克风/斌

    然后我根据最接近的例子创建了我自己的mkspec: cp -R [qt_install_dir]/mkspecs/qws/linux-arm-gnueabi-g++/ [qt_install_dir]/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命令:

      

    ./ configure -prefix /home/mike/qt4.7.1_source/my_qt -embedded arm -platform qws / linux-x86_64 -g ++ -xplatform 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_SHARED -DQT_BUILD_CORE_LIB -DQT_NO_USING_NAMESPACE -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT3_SUPPORT -DQT_MOC_COMPAT -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DELF_INTERPRETER = \ “/ 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。 -I ../../ include -I ../../ include / QtCore -I.rcc / release-shared-emb-arm -Iglobal -I ../ 3rdparty / harfbuzz / src -I ../ 3rdparty / md5 -I ../ 3rdparty / md4 -I.moc / release-shared-emb-arm kernel / qobject.h -o .moc / release-shared-emb-arm / moc_qobject.cpp arm-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_USING_NAMESPACE -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT3_SUPPORT -DQT_MOC_COMPAT -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DELF_INTERPRETER = \ “/ 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。 -I ../../ include -I ../../ include / QtCore -I.rcc / release-shared-emb-arm -Iglobal -I ../ 3rdparty / harfbuzz / src -I ../ 3rdparty / md5 -I ../ 3rdparty / md4 -I.moc / release-shared-emb-arm -o .obj / release-shared-emb-arm / qobject.o kernel / qobject.cpp
    {标准输入}:汇编程序消息:
       {标准输入}:1294:错误:所选处理器不支持Thumb模式'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

    所以,问题...... 为什么编译器抱怨拇指模式不受支持?由于这是基于 ARM 的处理器的交叉编译工具链,因此应该支持。事实上,它并没有让我觉得make以某种方式捡起了错误的g ++版本。

    对于出了什么问题以及如何解决这个问题的想法?

2 个答案:

答案 0 :(得分:2)

  

{标准输入}:1294:错误:所选处理器不支持Thumb模式'swp r6,r4,[r3]'

     

为什么编译器抱怨不支持拇指模式?

注意,编译器抱怨swp指令不适用于拇指模式。您的CPU支持 thumb thumb2 ARM 。 Cortex系列不赞成使用swp并且更喜欢ldrex/strex对。

  

对于出了什么问题以及如何解决这个问题的想法?

你需要让gcc来定义__ARM_ARCH_7__;这可以使用-mcpu=cortex-a8-mtune=cortex-a8-march=armv7-a组合或您喜欢的内容,具体取决于您希望 Qt 运行多少类型的主板。

详细信息,请参阅qatomic_arm.h,了解选择子文件的位置。您选择了非常通用的 ARM (我猜),因此您可以获得qatomic_armv5.h Note1 ,其中您可以看到第125行附近的代码。适合您的文件CPU是 qatomic_armv7.h ,主要包括qatomic_armv6.h。在此文件中,您可以找到ldrex/strexgcc正在请求的健康善良。

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

您可以尝试传递-armfpa进行配置。 ./configure -embedded arm --help很有用。 configure似乎选择了 NEON ,因此它似乎知道您拥有更高级的CPU( armv5 上没有 NEON >,但这可能是configure)的错误。

可以肯定的是,即使swp可能以某种方式工作,您也不希望ldrex/strex代码和swp是您的首选系统。我至少会解决这个问题。更改-xplatform qws/linux-am335x-g++以更新-mcpu或可能传递明确的-D__ARM_ARCH_7__。您可以使用arm-gcc -mcpu=cortex-a8 -dM -E - < /dev/null获取定义列表,以验证是否正在定义__ARM_ARCH_7__。看起来moc失败了,所以可能需要-D__ARM_ARCH_7_解决方案。

您也可以尝试在编译器选项中更改-mthumb。如果您可以使用-mcpu=cortex-a8-mthumb来编译/构建,那么最好使用-mthumb-Os。省略gcc会使代码略大一些。您也可以尝试gcc。出于某种原因,我有巨大的版本与其他优化和更新的 asm volatile("swpb %0,%2,[%3]" : "=&r"(ret), "=m" (*ptr) : "r"(newval), "r"(ptr) : "cc", "memory"); 版本。它似乎是由于一些C ++特性,因为正常的'C'不会这样做;但这可能只是我的编译器。我看着并相信它是异常表,但我从未确认任何事情并继续前进。我相信你知道Qt需要多长时间才能编译。

注1: qatomic_armv5.h 代码相当混乱,即使这是asm volatile("swpb %0,%1,[%2]" : "=r"(ret) : "0"(newval), "r"(ptr) : "memory"); binutils ,它们也会窒息正确使用的文件。

gcc

这指定了一些从未使用过的内联汇编程序参数。更不用说没有使用条件代码等。

ret

将使用较新的newval binutils 进行编译。它还使用较少的寄存器,并且最适合 Qt 当前使用它的方式;可能需要保留[x]以与swp进行比较,但目前只是用户空间自旋锁

括号%0是内存操作数寄存器,必须与有效%3的其他两个参数不同。我相信第一个表单用于阻止%0%1相同。第二种形式通过使%2和{{1}}相同来避免这种情况,因此{{1}}必须不同。

答案 1 :(得分:1)

usr的答案:无艺术的噪音事实上确实解决了我的问题,但是由于我想确保自己(如果需要)或其他人有一条非常明确的路径,我想准确说明修复的内容: / p>

首先,我将.configure命令更新为:

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

与问题的configure命令的唯一区别是删除了-fast选项。

然后在我的linux-am335x-g ++ / qmake.conf文件中,我添加了一些命令行选项:

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

通过这两项更改,我现在可以看到所有内容都构建并成功安装Qt4.7.1。

我也尝试过Qt4.8.5,除了必须在./configure命令中添加一个选项外,一切都运行相同:

-no-pch

这是为了避免关于:.pch的错误 目录和文件显示“没有这样的文件或目录”