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をクロスコンパイルする方法を見つけることです。どのオプションを無効にする必要があるかをご覧ください。