Compiling

如何處理使用 GCC 6.2.1 編譯 GCC 4.7.0 的錯誤

  • March 8, 2020

我正在使用 Arch linux,我需要 GCC 4.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 下並不總是被認為是有效的

我在這裡這里這裡讀到過。

那麼我能做些什麼來解決這個問題呢?

我認為兩種可能的解決方案可行:

  1. 使用學校 Linux 電腦為我的電腦交叉編譯 GCC 4.7.0(它們也有 GCC 4.7.0,但它們是 32 位的,我有 64 位作業系統)
  2. 首先在我的電腦上使用 GCC 6.2.1 編譯 GCC 5.4.x 然後使用 GCC 5.4.x 編譯 GCC 4.7.0

第一個選項似乎更防彈。他們倆會工作嗎?這個比那個好嗎?

編輯

正如@Kenneth B. Jensen 下面提到的,我嘗試使用設置的標誌執行配置--disable-werror並嘗試使用設置的標誌執行初始make配置,-k但我仍然遇到了麻煩。以下是錯誤輸出:

$ 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

您可能最終會花費大量時間在您目前的系統上建構 GCC 4.7,最終您仍然無法確定結果:您學校電腦的 GCC 版本可能包含分發更新檔甚至本地您的版本沒有的更改。

相反,我建議您執行學校在 VM 中使用的發行版。您的學校正在使用 RHEL,您也可以:您可以從Red Hat Developers獲得免費的開發人員訂閱;訂閱後,您可以下載任何仍受支持的 RHEL 版本的 ISO,因此您應該能夠安裝與學校電腦上使用的版本相同的版本。

無論如何,由於這是出於評分目的,因此您應始終在送出之前檢查學校電腦上的程式碼!

我同意使用更新的 gcc 通常不是一個好的選擇。我不得不為執行 Pengutronix 的嵌入式 ARM v4 系統編寫一個新程序,該系統卡在 2.6 核心和舊 glibc 上。因此我不得不在我的系統上編譯舊的工具鏈。

通常較新的 GCC 版本會在原始碼中發現錯誤,這些錯誤已經存在了很長時間。我建議不要關閉錯誤檢查,而是修復原始碼。

根據錯誤日誌,函式聲明和函式頭不匹配

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

在包含在 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);

然後編譯應該工作。

引用自:https://unix.stackexchange.com/questions/335717