私はこの数日間この問題を抱えていて、ここで実際に何が起こっているのか、あるいは何が問題なのかを頭に入れません。
これらのフラグを持つメイクファイルがあります:
CC = arm-linux-gnueabihf-gcc-4.6
FLAGS = -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -std=gnu99
.aファイルにライブラリがあります。これにはいくつかのオブジェクトファイルがあり、実行する必要があるのはそれらをリンクすることだけです。私はプロトタイプとそのすべてを知っていますが、不平を言うのは次のことだけです:
/usr/bin/ld: error: *EXECUTABLE* uses VFP register arguments, *OBJECTFILE* does not
/usr/bin/ld: failed to merge target specific data of file *OBJECTFILE*
-mfloat-abi = softfpを使用しないと、浮動小数点レジスタに関連する別のエラーが発生します。
誰がこれを引き起こしているのか、私の実行可能ファイルが仮想浮動小数点レジスタの引数を使用しないようにするなど、これを修正するためにできることは誰にもわかりませんか?
x@x:~/Desktop/perf_test$ make
arm-linux-gnueabihf-gcc-4.6 -c -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -std=gnu99 -mfloat-abi=softfp perf_test.c ../baseline/util.c
arm-linux-gnueabihf-gcc-4.6 -o perf_test perf_test.o util.o ../baseline/lib.a
/usr/bin/ld: error: perf_test uses VFP register arguments, perf_test.o does not
/usr/bin/ld: failed to merge target specific data of file perf_test.o
/usr/bin/ld: error: perf_test uses VFP register arguments, util.o does not
/usr/bin/ld: failed to merge target specific data of file util.o
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(a.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(a.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(b.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(b.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(c.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(d.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(d.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(e.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(e.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(f.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(f.o)
collect2: ld returned 1 exit status
make: *** [perf_test] Error 1
ターゲットのトリプレットは、コンパイラがhard-float ABI用に構成されていることを示しています。これは、libgccライブラリもhardfpであることを意味します。エラーメッセージは、システムの少なくとも一部がsoft-float ABIを使用していることを示しています。
コンパイラでmultilibが有効になっている場合(-print-multi-lib
で確認できます)、-mfloat-abi=softfp
を使用できますが、そうでない場合、そのオプションはあまり役に立ちません。gccはsoftfpコードを喜んで生成しますが、 'リンクする互換性のあるlibgccはありません。
基本的に、hardfpとsoftfpは互換性がありません。システム全体を何らかの方法で構成する必要があります。
編集:一部のディストリビューションは、「マルチアーチ」です。これらのいずれかをお持ちの場合、both ABIを一度にインストールできますが、それはすべてを2倍にすることで行われます-互換性の問題はまだ存在します。
Glibc binutilsとgccがクロスコンパイルされたarm hardfloatシステムで、gccを使用しても同じエラーが発生することがわかりました。
フラグにexport-mfloat-abi=hard
することで解決し、gccがエラーなしでコンパイルされます。
また、-marm -mthumb-interwork
のようないくつかのフラグを追加することでエラーを解決できます。この同じエラーを避けることは私にとって役に立ちました。
これは当て推量ですが、リンクステージにも浮動小数点関連のスイッチの一部またはすべてを提供する必要がある場合があります。
STM32F4でARMに対してAtollicを使用しているときに問題が発生しました(FPUを備えたすべてのSTM32に当てはまると思います)。
SW浮動小数点を使用してもうまくいきませんでした(したがって、正しくコンパイルされます)。
STM32cubeMXがTrueStudio(Atollic)のコードを生成するとき、C/C++ビルド設定でFPUユニットを設定しません(他のIDEの生成コードについては不明です)。
"Target"でFPUを設定します(プロジェクトプロパティビルド設定の下):
次に、HW/SW fpを混合するか、HWを使用するかを選択できます。
生成されたコマンドラインは、目的のターゲット用に追加されます。
-mfloat-abi=hard -mfpu=fpv4-sp-d16
私は同じ問題に直面していました。 Cyclone V FPGA-SoC用のLinuxアプリケーションを構築しようとしていました。私は次のような問題に直面しました:
エラー:<application_name>はVFPレジスタ引数を使用しますが、main.oは使用しません
ツールチェーンを使用していたarm-linux-gnueabihf-g++
アルテラの組み込みソフトウェア設計ツールによって提供されます。
エクスポートすることで解決します:mfloat-abi=hard
をフラグに、次にarm-linux-gnueabihf-g++
エラーなしでコンパイルします。また、CC
とLD
の両方にフラグを含めます。
私の場合 CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft
が助けてくれました。ご覧のとおり、私はstm32f407に使用しました。
リンクにも同じコンパイラオプションを使用します。
例:
gcc -mfloat-abi=hard fpu=neon -c -o test.cpp test.o
gcc -mfloat-abi=hard fpu=neon -c test1.cpp test1.o
gcc test.o test1.o mfloat-abi=hard fpu=neon HardTest
私の特定のケースでは-g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork
働いた。
この答えは表面上は無関係に見えるかもしれませんが、このエラーメッセージの間接的な原因があります。
最初に、「Use VFP register ...」エラーメッセージは、ビルド内でmfloat-abi = softオプションとmfloat-abi = hardオプションを混在させることによって直接引き起こされます。この設定は、リンクされるすべてのオブジェクトに対して一貫している必要があります。この事実は、この質問に対する他の回答で十分にカバーされています。
このエラーの間接的な原因は、Eclipseエディターがプロジェクトの「.cproject」ファイル内の自己負担エラーによって混乱しているためかもしれません。 Eclipseエディターは、ファイルリンクを頻繁に再スウィズルし、ディレクトリ構造またはファイルの場所を変更すると、リンク自体が破損する場合があります。これは、gccコンパイラへのパス設定にも影響する可能性があり、プロジェクトのファイルのサブセットのみに影響します。この障害の正確な原因はまだわかりませんが、.cprojectファイルをバックアップコピーに置き換えると、この問題は修正されました。私の場合、インクルードディレクトリパスを追加すると.Java.null.pointerエラーが発生し、「VFP登録エラー」メッセージが突然表示されるようになりました。ビルドログで、ワークスペースにローカルなソースの一部に対してgccコンパイラへの異なるパスが使用されていることに気付きましたが、すべてではありません!? 2つのgccコンパイラーは、不明な理由で異なる浮動小数点設定を使用していました-したがって、VFPレジスタエラー。
.cproject設定を古いコピーと比較し、プロジェクト設定のオーバーライドが無効になっていても、問題の原因となっているソースのエントリの違いを観察しました。 .cprojectファイルを古いバージョンに置き換えることにより、問題はなくなり、私はこの答えを何が起こったかを思い出させるものとして残しています。