如何處理使用 GCC 6.2.1 編譯 GCC 4.7.0 的錯誤
我正在使用 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 下並不總是被認為是有效的
那麼我能做些什麼來解決這個問題呢?
我認為兩種可能的解決方案可行:
- 使用學校 Linux 電腦為我的電腦交叉編譯 GCC 4.7.0(它們也有 GCC 4.7.0,但它們是 32 位的,我有 64 位作業系統)
- 首先在我的電腦上使用 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);
然後編譯應該工作。