gccクロスコンパイル失敗

gccクロスコンパイル失敗

ARM用のgccをクロスコンパイルしようとしています。これにより、既存のgcc ARMクロスコンパイラが更新されます。 libgcc1が正常にビルドされた後、libstdc ++ビルドが開始されるまで、ビルドは正常に実行されます。

エラーは次のとおりです。

<gcc-object-path>/./gcc/xgcc -shared-libgcc -B<gcc-object-path>/./gcc -nostdinc++ -L<gcc-object-path>/<target>/libstdc++-v3/src -L<gcc-object-path>/<target>/libstdc++-v3/src/.libs -L<gcc-object-path>/<target>/libstdc++-v3/libsupc++/.libs -B<sysroot>/<target>/bin/ -B<sysroot>/<target>/lib/ -isystem <sysroot>/<target>/include -isystem <sysroot>/<target>/sys-include --sysroot=<boot-strap-xgcc-sysroot>   -x c++-header -nostdinc++ -g -Os  -I<gcc-object-path>/<target>/libstdc++-v3/include/<target> -I<gcc-object-path>/<target>/libstdc++-v3/include -I<gcc-source-path>/libstdc++-v3/libsupc++ -O2 -g -std=gnu++0x <gcc-source-path>/libstdc++-v3/include/precompiled/stdc++.h \
        -o <target>/bits/stdc++.h.gch/O2ggnu++0x.gch
<gcc-source-path>/libstdc++-v3/include/precompiled/stdc++.h:52:20: fatal error: ccomplex: No such file or directory
 #include <ccomplex>
                    ^
compilation terminated.

gcc-object-path -name ccomplex -print が見つかると、次のようになります。

<gcc-object-path>/<target>/libstdc++-v3/include/tr1/ccomplex
<gcc-object-path>/<target>/libstdc++-v3/include/ccomplex

コンパイルコマンドは次のとおりです。

-I<gcc-object-path>/<target>/libstdc++-v3/include

上。

<gcc-object-path>/<target>/libstdc++-v3/include/ccommon

シンボリックリンクです

<gcc-source-path>/libstdc++-v3/include/c_std/ccomplex

ただし、その場所のソースコードにはファイルが存在しないため、シンボリックリンクが壊れてコンパイルが失敗します。ただし、ccomplex ファイルはソースツリー内の他の 3 つの場所に存在します。さらに、壊れたシンボリックリンクが6つあります。

これらのシンボリックリンクを生成するlibstdc ++-v3/include/Makefileを見ると、ソースツリーの同じ場所にあるすべてのc_base_headersファイルが見つかると予想されますが、そうではありません。これはどのように機能しますか?

gcc設定オプションは次のとおりです。

gcc-${GCC_VERSION}/configure --target=$CONF_TARGET --prefix=${PREFIX} --exec_prefix=${PREFIX} --bindir=${PREFIX}/bin --sbindir=${PREFIX}/bin --libexecdir=${PREFIX}/libexec --datadir=${PREFIX}/share --sysconfdir=${PREFIX}/etc --sharedstatedir=${PREFIX}/share/com --localstatedir=${PREFIX}/var --libdir=${PREFIX}/lib --includedir=${PREFIX}/include --oldincludedir=${PREFIX}/include --infodir=${PREFIX}/share/info --mandir=${PREFIX}/share/man --enable-largefile --disable-nls --enable-ipv6 --with-gnu-ld --enable-shared --enable-languages=c,c++,objc,fortran --enable-threads=posix --disable-multilib --enable-c99 --enable-long-long --enable-symvers-gnu --enable-libstdcxx-pch --program-prefix=${CMD_PREFIX} --enable-target-optspace --enable-cheaders=c_std --disable-bootstrap --disable-libgomp --disable-libmudflap --with-float=soft --with-sysroot=${NEWSYSROOT} --with-build-sysroot=${SYSROOT} --with-build-time-tools=${INSTALLDIR}/${PREFIX}/${CONF_TARGET}/bin --disable-libunwind-exceptions --disable-libssp --enable-__cxa_atexit

ベストアンサー1

どの環境を使用していますか?あなたのターゲット環境は何ですか?

ARMにはダウンロードできるツールチェーンがいくつかあります。ARM開発者ウェブサイト

ターゲット環境でライブラリとヘッダーファイルを使用できるようにする必要があるかもしれません。 FreeBSDの場合、これは適切なbase.txzファイルになり、正しい場所に抽出する必要があります。

386およびamd64 FreeBSD v 11.*i用のARM用の既存のGCCクロスコンパイラーがあります。または具体的にはarm64 / aarch64。エイダとも同じだ。これは/usr/ports/lang/gnatcross*にあるポートの1つです。

Googleで検索すると、いくつかの設定オプションを使用して一般的なarmクロスコンパイラを簡単にコンパイルできます。多くの人がクロスコンパイラをコンパイルするときにarmを例として使用します。

ARM または aarch64 アーキテクチャ Raspberry PI をお持ちの場合は、おそらく良い基本環境を持つことになります。もしそうなら、あなたがしなければならないことはOSに頼らないだけです。

RPIは、FreeBSD、Raspbian、その他のLinuxおよびBSDバージョンを含むさまざまなオペレーティングシステムで利用できます。

私はaarch64 FreeBSD 12用のGCCをクロスコンパイルしています。少し変更が必要です。だから関連ポートをコピーして修正しました。難しいのは、gccをクロスコンパイルする方法を見つけることです。どのオプションを無効にする必要があるかをご覧ください。

おすすめ記事