代码之家  ›  专栏  ›  技术社区  ›  PhilBot

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

  •  3
  • PhilBot  · 技术社区  · 13 年前

    我正在尝试使用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”选项与CodeSourceryWindows工具链配合良好,但与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?

    1 回复  |  直到 13 年前
        1
  •  3
  •   shawn xy bai    13 年前

    - 嗨,phil999,
    Cortex-A系列编程器指南版本:2.0
    http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013a/index.html

    从文件中可以看出
    -mfpu=vfp指定目标具有vfp硬件。(指定选项-mfpu=氖也是如此。)
    因此,根据您的C_FLAGS,选项“mfpu=vfp”等同于选项“mfpu=氖”, 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文件,您还应该用“-mfluat abi=hard”编译QT,否则,会有一些类似的投诉。

    此外,从gcc-linaro-arm-linux-gnueabihf-2012.06-20120625_win32\gcc-linoro-arm-lianux-gnuebihf-2012.06-2120625_win 32\share\doc\gcc-linearo-arm-linux-gneabihf中的自述文件

    自述中的一些要点如下

    目标兼容性


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

    • 在所有Cortex-A配置文件设备上运行
    • 针对Cortex-A9进行了调整
    • 拇指-2
    • “硬浮动”调用约定
    • 使用VFPv3-D16 FPU
    • 启用了多拱形和多立管
    • 乙二醇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版中的“GCC中的18.2 VFP支持”和“15.1.1 VFP和NEON寄存器使用”。

    谢谢