gpt4 book ai didi

使用 Windows 中的 Linaro 工具链为嵌入式 Linux 交叉编译 Qt 4.8

转载 作者:行者123 更新时间:2023-12-04 13:34:52 29 4
gpt4 key购买 nike

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

我已经将上面帖子中提到的 mkspec 修补成如下所示:

#
# 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 库时,它会编译一段时间但不可避免地会出错:

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

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

*.so uses VFP register arguments, *obj does not

我已经研究了该错误并尝试将以下每个选项传递给我的 mkespec 并使用相同的错误进行重建:

-mfloat-abi=softfp
-mfloat-abi=soft
-mfloat-abi=hard

我显然不明白为什么“-mfloat-abi=softfp”选项适用于 CodeSourcery Windows 工具链但不适用于 Linaro。其余的编译器标志显示在上面的 mkspec 中。

是否有人对如何使这项工作有任何见解或想法?提前致谢。

更新:

事实证明,如果我从此修改 mkspec 中的 C_FLAGS:

-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=vfp -mfloat-abi=softfp -Wa,-mimplicit-it=thumb -marm -mthumb-interwork

为此:

-march=armv7-a -mtune=cortex-a8 -mthumb -mfpu=neon -mfloat-abi=hard -Wa,-mimplicit-it=thumb -marm -mthumb-interwork

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

最佳答案

-嗨,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=hard”之间。

根据提供的错误,

此错误发生在许多投诉之后,例如:*.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 中的自述文件

readme中的一些要点如下

目标兼容性


arm-linux-gnueabihf 版本针对 Linaro 评估构建Ubuntu 12.04“精确穿山甲”的 12.05 版本。默认的配置是:

  • 在所有 Cortex-A 配置文件设备上运行
  • 针对 Cortex-A9 进行了调整
  • 拇指 2
  • 'hard float'调用约定
  • 使用 VFPv3-D16 FPU
  • 启用多架构和多库
  • EGLIBC 2.15
  • GCC 4.7 系列 libgcc 和 libstdc++

使用softfp还是hard

两点:
1. 将float-abi与"softfp"结合使用,向后兼容旧的softfp ABI代码。
2. 使用"-mfloat-abi=hard",效率更高,但不向后兼容softfp abi代码。

更多详细信息请参见开头列出的 Cortex-A 系列程序员指南版本:2.0 中的“18.2 GCC 中的 VFP 支持”和“15.1.1 VFP 和 NEON 寄存器的使用”。

谢谢。

关于使用 Windows 中的 Linaro 工具链为嵌入式 Linux 交叉编译 Qt 4.8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511994/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com