web-dev-qa-db-ja.com

GCC6.2.1を使用してGCC4.7.0をコンパイルする際のエラーを処理する方法

Arch Linuxを使用していて、クラスにGCC4.7.0が必要です。

私のシステムには現在、GCC 6.2.1しかインストールされていません。

すべてのインストール手順を正しく実行しましたが、最初のmakeを実行した後でもこのエラーが発生します。

$ make
.
.
In file included from /home/flounder/src/gcc-4.7.0/gcc-4.7.0/gcc/cp/except.c:987:0:
cfns.gperf: At top level:
cfns.gperf:101:1: error: ‘gnu_inline’ attribute present on ‘libc_name_p’
cfns.gperf:26:14: error: but not here
.
.
make[3]: *** [Makefile:1055: cp/except.o] Error 1
make[3]: Leaving directory '/home/flounder/src/gcc_compile/gcc'
make[2]: *** [Makefile:4101: all-stage1-gcc] Error 2
make[2]: Leaving directory '/home/flounder/src/gcc_compile'
make[1]: *** [Makefile:19342: stage1-bubble] Error 2
make[1]: Leaving directory '/home/flounder/src/gcc_compile'
make: *** [Makefile:898: all] Error 2

これは、古いバージョンのGCCを最新バージョンでビルドしようとすると発生する可能性があることを読みました。理由は次のとおりです。

GCCはバージョンが進むにつれて新しいエラーを追加するため、古いバージョンのGCCのソースコードが新しいバージョンのGCCで常に有効であるとは見なされません。

ここここここ と読みました。

したがって、問題を解決するにはどうすればよいですか

私がうまくいくと思う2つの可能な解決策:

  1. 学校のLinuxコンピューターを使用してコンピューター用にGCC4.7.0をクロスコンパイルします(GCC 4.7.0もありますが、32ビットで64ビットOSを使用しています)
  2. まず、GCC6.2.1を使用してコンピューターでGCC5.4.xをコンパイルし、次にGCC5.4.xを使用してGCC4.7.0をコンパイルします。

最初のオプションはより防弾のようです。それらは両方とも機能しますか?一方はもう一方よりも優れていますか?

編集

@Kenneth B. Jensenが後述するように、--disable-werrorフラグを設定して構成を実行しようとし、-kフラグを設定して最初のmakeを実行しようとしましたが、それでも遭遇しました。トラブル。エラー出力は次のとおりです。

$ make -k
.
.
.
if [ xinfo = xinfo ]; then \
    makeinfo --split-size=5000000 --split-size=5000000 --split-size=5000000 --no-split -I . -I /home/flounder/src/gcc-4.7.0/gcc/doc \
            -I /home/flounder/src/gcc-4.7.0/gcc/doc/include -o doc/cppinternals.info /home/flounder/src/gcc-4.7.0/gcc/doc/cppinternals.texi; \
fi
echo timestamp > gcc.pod
Perl /home/flounder/src/gcc-4.7.0/gcc/../contrib/texi2pod.pl /home/flounder/src/gcc-4.7.0/gcc/doc/invoke.texi > gcc.pod
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/^\@strong{ <-- HERE (.*)}$/ at /home/flounder/src/gcc-4.7.0/gcc/../contrib/texi2pod.pl line 319.
echo timestamp > doc/gcc.1
(pod2man --center="GNU" --release="gcc-4.7.0" --date=2012-03-22 --section=1 gcc.pod > doc/gcc.1.T$$ && \
    mv -f doc/gcc.1.T$$ doc/gcc.1) || \
    (rm -f doc/gcc.1.T$$ && exit 1)
echo timestamp > gpl.pod
Perl /home/flounder/src/gcc-4.7.0/gcc/../contrib/texi2pod.pl /home/flounder/src/gcc-4.7.0/gcc/doc/include/gpl_v3.texi > gpl.pod
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/^\@strong{ <-- HERE (.*)}$/ at /home/flounder/src/gcc-4.7.0/gcc/../contrib/texi2pod.pl line 319.
echo timestamp > doc/gpl.7
(pod2man --center="GNU" --release="gcc-4.7.0" --date=2012-03-22 --section=7 gpl.pod > doc/gpl.7.T$$ && \
    mv -f doc/gpl.7.T$$ doc/gpl.7) || \
    (rm -f doc/gpl.7.T$$ && exit 1)
cp doc/gcc.1 doc/g++.1
make[3]: Target 'all' not remade because of errors.
rm gcc.pod
make[3]: Leaving directory '/home/flounder/src/gcc_compile/gcc'
make[2]: *** [Makefile:4101: all-stage1-gcc] Error 2
make[2]: Target 'all-stage1' not remade because of errors.
make[2]: Leaving directory '/home/flounder/src/gcc_compile'
make[1]: *** [Makefile:19342: stage1-bubble] Error 2
make[1]: Target 'stage3-bubble' not remade because of errors.
make[1]: Leaving directory '/home/flounder/src/gcc_compile'
make: *** [Makefile:898: all] Error 2
3
Maxwell Morgan

おそらく、現在のシステムでGCC 4.7をビルドするのにかなりの時間を費やすことになり、最終的には結果が確実にわかりません。学校のコンピューターのGCCのバージョンには、配布パッチまたはローカルあなたのバージョンにはない変更。

代わりに、学校で使用しているディストリビューションをVMで実行することをお勧めします。あなたの学校はRHELを使用しており、次のこともできます。無料の開発者サブスクリプションを Red Hat Developers から入手できます。サブスクリプションを取得すると、まだサポートされているバージョンのRHELのISOをダウンロードできるため、学校のコンピューターで使用されているものと同じバージョンをインストールできるはずです。

いずれにしても、これはグレーディングの目的であるため、提出する前に必ず学校のコンピュータでコードを確認してください。

3
Stephen Kitt

新しいgccを使用することはしばしば良い選択肢ではないことに同意します。 2.6カーネルと古いglibcでスタックしたPengutronixを実行する組み込みARM v4システム用の新しいプログラムを作成する必要がありました。したがって、システムで古いツールチェーンをコンパイルする必要がありました。

多くの場合、GCCの新しいバージョンでは、かなり前から存在していたソースコードのエラーが見つかります。エラーチェックをオフにする代わりに、代わりにソースコードを修正することをお勧めします。

エラーログによると、関数宣言と関数ヘッダーが一致しません

const char * libc_name_p (const char *, unsigned int);

exception.cに含まれるファイルcfns.h内

Cfns.hを編集し、関数宣言を変更します

#ifdef __GNUC__
__inline
#endif
const char * libc_name_p (const char *, unsigned int);

#ifdef __GNUC__
__inline
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * libc_name_p (const char *, unsigned int);

その後、コンパイルが機能するはずです。

3
AxelBe

GCCの構成オプションを見ると、./configure --disable-werrorを発行し、make -kを使用してGCCを構築すると正常に実行される可能性があります。

Manページから(make(1)):

-k、-keep-going 
エラーが発生した後は可能な限り続行します。失敗した
ターゲット、およびそれに依存するターゲットを
リメイクすることはできませんが、これらのターゲットの他の依存関係は
すべて同じように処理できます。

X86_64上のGCC6.2.1でGCC4.7.0をコンパイルするためにこれらの両方を実行した後、問題なくコンパイルされているように見えますが、執筆時点では、コンパイルは完了していません。

1

@AxelBeの回答を拡張するには:新しいGCCでは、関数の宣言と定義の両方をcfns.hで変更する必要がある場合があります。

#ifdef __GNUC__
__inline
#endif
const char * libc_name_p (const char *, unsigned int);

または

#ifdef __GNUC__
__inline
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * libc_name_p (const char *, unsigned int);

#ifdef __GNUC__
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#else
__inline
#endif
#endif
const char * libc_name_p (const char *, unsigned int);

__inline属性と__gnu_inline__属性が同時に存在しないようにする(エラーredeclared inline with 'gnu_inline' attributeが発生する)。これは、GCC 5.3をGCC 9.2でコンパイルするときに機能しました。

0
Tomasz

これは単にエラーを「修正」するためです。それを修正した後、別のエラーが表示されます。

それを修正するには-

ファイル./gcc/cp/cfns.gperfの23〜26行目

#ifdef __GNUC__
__inline
#endif
const char * libc_name_p (const char *, unsigned int);

ifdefステートメントをコメント化するだけです。

新しいエラー-

cp/except.o: In function `nothrow_libfn_p':
/home/user/Documents/build/gcc464objdir/gcc/../../gcc-4.6.4/gcc/cp/except.c:932: undefined reference to `libc_name_p'
collect2: error: ld returned 1 exit status
0
Yvon

ただし、解決策を見直した後、私はリゾルバーではありません。最後に、 https://github.com/cbrune/onie/commit/7b7331d45214435a93e604b92c54f05fcdca52b8 に投稿された他のスレッドの解決策に従うことができます

ファイル132-build_gcc-5_with_gcc-6.patchにパッチを適用すると、ビルドを問題なく続行できます。

0
Jiang Junyu