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

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

  1. 我的预期输出是为了运行Qt应用程序而需要存在的共享对象库。
  2. 我的目标平台是采用ARM Cortex-A8架构的TI AM335x处理器。
  3. 我的开发平台是x86 64位Ubuntu虚拟机

我对这个应该如何工作的理解是,我下载了我的目标平台(这是TI的Linaro工具链)的工具链,我下载了Qt 4.7.1的源代码,我设置了mkspec来使用我的工具链,运行configure ,那么只需要运行make / make install ,我应该能够find所有.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:/home/mike/bin:/usr/lib/lightdm/lightdm:/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin目录:/ bin中:在/ usr /游戏:/首页/麦克风/箱

然后我根据最接近的例子创build了自己的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 

然后我运行了一个configuration命令:

./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 -accessible -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
{标准input}:汇编器消息:
{标准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

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

任何想什么错了,如何解决这个问题?

Solutions Collecting From Web of "从ARM的源代码交叉编译Qt 4.7的问题"

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

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

请注意,编译器抱怨swp指令不适用于拇指模式 。 您的CPU支持thumbthumb2ARM 。 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 注1 ,你可以看到线125周围的代码。你的CPU的正确的文件是qatomic_armv7.h ,主要是包括qatomic_armv6.h 。 在这个文件中,你可以找到ldrex/strex ,这是你的gcc正在请求的健康善良。

我也建议你不要用-fast编译。 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版本的巨大构建。 这似乎是由于一些C ++功能,因为正常“C”不这样做; 但这可能只是我的编译器。 我看了看,相信这是例外表,但我从来没有证实任何东西,继续前进。 我相信你知道Qt需要多长时间来编译。

注1: qatomic_armv5.h代码相当混乱,即使这是正确的文件,新的gccbinutils也会窒息。

  asm volatile("swpb %0,%2,[%3]" : "=&r"(ret), "=m" (*ptr) : "r"(newval), "r"(ptr) : "cc", "memory"); 

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

 asm volatile("swpb %0,%1,[%2]" : "=r"(ret) : "0"(newval), "r"(ptr) : "memory"); 

将用更新的gccbinutils进行编译。 它也使用较少的寄存器,并且是Qt当前使用它的最佳方式; 有些情况下需要ret来与newval进行比较,但目前它只是一个用户空间自旋锁

括号[x]是内存操作数寄存器,并且必须与有效的swp的另外两个参数不同。 我相信第一种形式被用来阻止%0%3相同。 第二种形式通过使%0%1相同来避免这种情况,所以%2必须不同。

usr的答案是:无用的噪音实际上确实解决了我的问题,但是由于我想确保自己(如果需要的话)或其他人有一个非常清晰的线索,我想确切地说明解决方法是什么:

首先,我将.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

与问题的配置命令唯一的区别是删除-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目录和侧面显示“没有这样的文件或目录”