C++ 从源代码为ARM交叉编译Qt4.7时出现的问题
我正在尝试从源代码交叉编译Qt 4.7.1,以下是关于我的设置的一些说明: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,我就可以找到所有的。所以就是我告诉它安装到的地
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