3

Linaro ツールチェーン Windows バイナリ ( https://launchpad.net/linaro-toolchain-binaries/trunk/ ) の 2012.06 バージョンを使用して、組み込み Linux ARM Cortex-8 ボードをターゲットとするように Qt 4.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)

ARM ボード用の Qt ライブラリを生成するために最上位の Makefile で mingw32-make を実行すると、しばらくの間コンパイルされますが、必然的に次のエラーが発生します。

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 では実行できるのですか?

4

1 に答える 1

3

- こんにちは、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 uses VFP register arguments, *obj does not


libファイルは「uses VFP register arguments」で認識される「-mfloat-abi=hard」でコンパイルされているようです。

オプション "-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 から

readme のいくつかのポイントは次のとおりです。

ターゲットの互換性


arm-linux-gnueabihf バージョンは、Ubuntu 12.04「Precise Pangolin」の Linaro Evaluation Build 12.05 フレーバーをターゲットにしています。デフォルトの構成は次のとおりです。

  • すべての Cortex-A プロファイル デバイスで実行
  • Cortex-A9用に調整
  • 親指-2
  • 'hard float' 呼び出し規約
  • VFPv3-D16 FPU を使用
  • マルチアーチとマルチライブラリが有効
  • エグリブ 2.15
  • GCC 4.7 シリーズの libgcc および libstdc++

softfp または hard を使用するには

2つのポイント:
1.「softfp」でfloat-abiを使用すると、古いsoftfp ABIコードとの下位互換性があります。
2. 「-mfloat-abi=hard」を使用すると、より効率的になりますが、softfp abi コードとの下位互換性はありません。

詳細については、「Cortex-A Series Programmer's Guide Version: 2.0」の冒頭に記載されている「18.2 GCC での VFP サポート」および「15.1.1 VFP と NEON レジスタの使用」を参照してください。

ありがとう。

于 2012-07-18T02:08:36.867 に答える