我正在尝试从源代码交叉编译Qt 4.7.1,这里有一些关于我的设置的注释:
我对这应该如何工作的理解是我下载了我的目标平台的工具链(这是来自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 ++版本。
对于出了什么问题以及如何解决这个问题的想法?
答案 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/strex
,gcc
正在请求的健康善良。
我还建议您不要使用 -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的错误 目录和文件显示“没有这样的文件或目录”