首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt 4.8使用Windows中的Linaro工具链进行嵌入式Linux交叉编译

问Qt 4.8使用Windows中的Linaro工具链进行嵌入式Linux交叉编译
EN

Stack Overflow用户
提问于 2012-07-17 04:26:40
回答 1查看 10.6K关注 0票数 3

我正在尝试使用Linaro Toolchain Windows Binary ( https://launchpad.net/linaro-toolchain-binaries/trunk/ )的2012.06版本来交叉编译Qt4.8源代码,以针对嵌入式Linux ARM Cortex-8板。我能够使用这篇文章--> http://c2143.blogspot.com/?view=classic中提到的CodeSourcery工具链做到这一点。但是目标板软件是用Linaro工具链构建的,所以我正在朝着这个目标努力。

我已经为上面帖子中提到的mkspec打了补丁,如下所示:

代码语言:javascript
复制
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
include(../common/unix.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
include(../common/qws.conf)

MAKEFILE_GENERATOR      = MINGW
CONFIG                 += no_import_libs no_generated_target_info
# 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++
QMAKE_LIB               = arm-linux-gnueabihf-ar
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_STRIP             = arm-linux-gnueabihf-strip
QMAKE_RUN_CC            = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CC_IMP        = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
QMAKE_RUN_CXX           = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
QMAKE_INCDIR            =
QMAKE_INCDIR_QT         = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT         = $$[QT_INSTALL_LIBS]
QMAKE_MOC               = $$[QT_INSTALL_BINS]\\moc.exe
QMAKE_UIC               = $$[QT_INSTALL_BINS]\\uic.exe
QMAKE_IDC               = $$[QT_INSTALL_BINS]\\idc.exe
QMAKE_COPY              = copy /y
QMAKE_COPY_DIR          = xcopy /s /q /y /i
QMAKE_MOVE              = move
QMAKE_DEL_FILE          = del
QMAKE_MKDIR             = mkdir
QMAKE_DEL_DIR           = rmdir
QMAKE_CHK_DIR_EXISTS    = if not exist
QMAKE_IDL               = midl
QMAKE_ZIP               = zip -r -9
CODESOURCERY_ARM_CFLAGS = -march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=vfp -mfloat-abi=softfp -Wa,-mimplicit-it=thumb -marm -mthumb-interwork
#modifications to gcc-base.conf
QMAKE_CFLAGS           += $$CODESOURCERY_ARM_CFLAGS
QMAKE_CXXFLAGS         += $$CODESOURCERY_ARM_CFLAGS
QMAKE_LIBS             += -lrt -lpthread -ldl
QMAKE_LFLAGS           += $${QMAKE_LFLAGS_RPATH}$$[QT_INSTALL_LIBS]
!isEmpty(TARGET_QTDIR) {
    QMAKE_LFLAGS       += $${QMAKE_LFLAGS_RPATH}$${TARGET_QTDIR}/lib
}
!isEmpty(TARGET_SYSROOT) {
    QMAKE_LFLAGS       += $${QMAKE_LFLAGS_RPATH}$${TARGET_SYSROOT}/lib:$${TARGET_SYSROOT}/usr/lib
    QMAKE_LFLAGS       += -Wl,--dynamic-linker=$${TARGET_SYSROOT}/lib/ld-linux.so.3
}
load(qt_config)

当我在顶层Makefile上运行mingw32-make,以便为ARM板生成Qt库时,它会编译一段时间,但不可避免地会出现以下错误:

代码语言:javascript
复制
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [..\..\lib\libQtCore.so] Error 1
mingw32-make[1]: Leaving directory `C:/Users/user/Desktop/qt_creator_toolchain...
mingw32-make: *** [sub-corelib-make_default-ordered] Error 2

此错误发生在许多投诉之后,例如:

代码语言:javascript
复制
*.so uses VFP register arguments, *obj does not

我研究了这个错误,并尝试将以下每个选项传递给我的mkespec并重新编译,但出现了相同的错误:

代码语言:javascript
复制
-mfloat-abi=softfp
-mfloat-abi=soft
-mfloat-abi=hard

我显然不明白为什么'-mfloat-abi=softfp‘选项可以很好地与Linaro Windows工具链一起使用,而不是CodeSourcery。其余的编译器标志在上面的mkspec中显示。

有没有人对如何实现这一点有什么见解或想法?提前谢谢。

更新:

如果我在mkspec中修改我的C_FLAGS如下:

代码语言:javascript
复制
-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=vfp -mfloat-abi=softfp -Wa,-mimplicit-it=thumb -marm -mthumb-interwork

要这样做:

代码语言:javascript
复制
-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=neon -mfloat-abi=hard -Wa,-mimplicit-it=thumb -marm -mthumb-interwork

然后我终于可以成功地编译Qt了。这将如何影响我在主板上运行Qt应用程序的性能/或能力?为什么我不能用Linaro做softfp,但我能用CodeSourcery?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-18 10:08:37

  • 嗨,phil999,

Cortex-A系列程序员指南版本: 2.0

在http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013a/index.html

从文件中可以知道,

-mfpu=vfp指定目标系统具有VFP硬件。(指定选项-mfpu=neon也是如此。)

所以,根据你的C_FLAGS,选项"-mfpu=vfp“等同于选项”-mfpu=neon“,Linaro的区别可能在于选项"-mfloat-abi=softfp”和选项“-mfloat-abi=-mfpu=neon”。

从所提供的错误中,

出现此错误的原因很多,例如:*.so使用VFP寄存器参数,*obj不使用

似乎lib文件是用"-mfloat-abi=hard“编译的,这可以通过”使用VFP寄存器参数“来识别。

‘因为如果选项"-mfloat-abi=softfp“用于编译lib文件,则会在R0-R3和堆栈空间中传递浮点参数;

在VFP或NEON浮点寄存器中传递浮点参数时,必须指定选项"-mfloat-abi=hard“。

所以,为了链接那些用"-mfloat-abi=hard“编译的lib文件,你也应该用"-mfloat-abi=hard”来编译QT,否则,你会遇到一些类似的抱怨。

此外,从gcc-linaro-arm-linux-gnueabihf-2012.06-20120625_win32\gcc-linaro-arm-linux-gnueabihf-2012.06-20120625_win32\share\doc\gcc-linaro-arm-linux-gnueabihf的自述文件中

自述文件中的一些要点如下

目标兼容性

arm-linux-gnueabihf版本的目标是Linaro评估版本12.05版本的Ubuntu 12.04“精确穿山甲”。默认配置为:

VFPv3-D16 FPU

  • Multiarch和multilib enabled

  • EGLIBC 2.15
  • 可在所有Cortex-A profile设备上运行,并针对Cortex-A9
  • Thumb-2
  • 'hard float‘calling
  • 进行了调整。
  • A GCC 4.7系列libgcc和libstdc++

使用softfp或hard

两点:

  1. 使用带" softfp“的float-abi,它向后兼容旧的softfp ABI代码。
  2. 带"-mfloat- abi =hard",效率更高,但不向后兼容softfp abi代码。

更多细节将在开头列出的Cortex-A系列程序员指南2.0版中的“18.2VFP在GCC中的支持”和"15.1.1 VFP和霓虹灯寄存器的使用“中找到。

谢谢。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11511994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档