GCC 8.4.1を使用してCentOS 8 ClassicにGCC 4.8.5をインストールしようとしています。私がしたことは次のとおりです(最近の進捗状況を反映して質問が更新されました)。
前提条件のインポート
yum install gcc make glibc-devel glibc-devel.i686 libstdc++-8.4.1-1.el8.i686
以下の説明に従って、コンパイラとその依存関係を取得します。
https://bytefreaks.net/gnulinux/downgrade-gcc-on-centos-7-0-64bit-to-version-4-8-2
wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
tar -xvf gcc-4.8.5.tar.gz;
cd gcc-4.8.5/
./contrib/download_prerequisites;
libc_name_p の二重定義を回避するには、次のようにファイルをパッチします。
https://unix.stackexchange.com/a/571800
Except.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);
次のコードとそれに続く宣言/定義
#ifdef __GNUC__
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#else
__inline
#endif
#endif
以下の説明に従ってファイルをパッチして ucontext_t の名前を変更します。
https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=883312dc79806f513275b72502231c751c14ff72
ファイル内でisなどstruct ucontext
に置き換えます。ucontext_t
libgcc/config/<arch>/linux-unwind.h
<arch>
i386
aarch64
alpha
ここで説明されているように構成します。
dnf経由でCentos 8にレガシーgccパッケージをインストールする
mkdir BUILD
cd BUILD
export CFLAGS="-O2 -march=native -pipe"
export CXXFLAGS=$CFLAGS
export LD_LIBRARY_PATH="/lib:/lib64:"$LD_LIBRARY_PATH
../configure --prefix=$HOME/local/gcc/4.8.5
立てる
make
make install
次のエラーにより、MAKE フェーズでプロセス全体が失敗します。
/home/sergey/Desktop/gcc-4.8.5/BUILD/./gcc/cc1plus:
/home/sergey/Desktop/gcc-4.8.5/BUILD/x86_64-unknown-linux-gnu/
libstdc++-v3/src/.libs/libstdc++.so.6: version `CXXABI_1.3.9' not found
(required by /home/sergey/Desktop/gcc-4.8.5/BUILD/./gcc/cc1plus)
取り付け位置を修正してみLD_LIBRARY_PATH="/lib:/lib64:"$LD_LIBRARY_PATH
ましたが、役に立ちませんでした。どちらも必要なバージョンが存在するようです。libstdc++-8.4.1-1.el8.x86_64
libstdc++-8.4.1-1.el8.x686
CXXABI
/lib
/lib64
strings /lib64/libstdc++.so.6 | grep CXXABI
...
CXXABI_1.3.9
...
私が試した代替案(また失敗しました)
以下を設定すると、次のようになりexport CXXFLAGS=$CFLAGS" -std=gnu++98"
ます。
make[6]: *** No rule to make target '../src/c++11
/libc++11convenience.la', needed by 'libstdc++.la'. Stop.
設定すると、--with-multilib-list=m64
次のようになります。
configure: error: in `/home/sergey/Desktop/gcc-4.8.5/BUILD/
x86_64-unknown-linux-gnu/libsanitizer':
configure: error: C compiler cannot create executables
この問題を克服する方法を理解するのに役立ちますか?ありがとう
答え1
適切なものからエラーレポート:
ヤクブイエリーネック2017-05-13 06:52:08 UTC
バグはGCC 4.8側にあるため、パッチを適用するか、-std=gnu++98でビルドする必要があります。これで __GNUC_STDC_INLINE__ が定義されず、正しくコンパイルされます。
この回答も確認してください。https://unix.stackexchange.com/a/472713/260833