我正在尝试使用Linaro Toolchain Windows Binary的2012.06版本(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]: *** [....liblibQtCore.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?
-嗨,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=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-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
- "hard-foat"调用约定
- 使用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版中的"GCC中的18.2 VFP支持"one_answers"15.1.1 VFP和NEON寄存器使用"。
谢谢。