Como lidar com erros ao compilar o GCC 4.7.0 usando o GCC 6.2.1

1

Estou usando o Arch linux e preciso do GCC 4.7.0 para uma aula.

Eu só tenho o GCC 6.2.1 instalado no meu sistema atualmente.

Eu segui todas as instruções de instalação corretamente, mas ainda produzo esse erro depois de executar o make inicial.

$ 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

Eu li que isso pode acontecer ao tentar criar versões antigas do GCC com versões modernas porque:

GCC adds new errors as versions go on, so the source code of older versions of GCC isn't always considered valid under newer versions of GCC

Eu li que aqui , aqui e here .

Então o que posso fazer para resolver o problema ?

Duas soluções possíveis que eu acho que poderiam funcionar:

  1. Cross compile o GCC 4.7.0 para o meu computador usando os computadores Linux da escola (que também possuem o GCC 4.7.0, mas eles são de 32 bits e eu tenho um sistema operacional de 64 bits)
  2. Primeiro compile o GCC 5.4.x no meu computador usando o GCC 6.2.1 e depois use o GCC 5.4.x para compilar o GCC 4.7.0

A primeira opção parece mais à prova de balas. Ambos trabalhariam? Um é melhor que o outro?

Editar :

Como @Kenneth B. Jensen mencionado abaixo, tentei executar a configuração com o sinalizador --disable-werror definido e tentei executar o make inicial com o sinalizador -k definido, mas ainda assim tive problemas. O seguinte é a saída de erro:

$ 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
    
por Maxwell Morgan 08.01.2017 / 06:15

3 respostas

2

Você provavelmente acabará gastando muito tempo criando o GCC 4.7 em seu sistema atual e, no final, ainda não terá certeza do resultado: a versão do GCC dos computadores da sua escola pode incluir patches de distribuição ou até mesmo alterações locais que sua versão não terá.

Em vez disso, sugiro que você execute a distribuição que sua escola está usando em uma VM. Sua escola está usando o RHEL, e você também pode: você pode obter uma assinatura de desenvolvedor sem custo de Red Hat Developers ; Depois de obter sua assinatura, você pode fazer o download de ISOs de qualquer versão do RHEL que ainda seja suportada. Portanto, você deve instalar a mesma versão usada nos computadores da escola.

De qualquer forma, uma vez que isso é para fins de avaliação, você deve sempre verificar seu código nos computadores da escola antes de enviá-lo!

    
por 12.01.2017 / 17:54
1

Olhando as opções de configuração para o GCC, ele pode fazer com sucesso ao emitir ./configure --disable-werror e, em seguida, criar o GCC com make -k .

Da página man (make (1)):

 -k, --keep-going
            Continue  as much as possible after an error.  While the 
            target that failed, and those that depend on it, cannot be 
            remade, the other dependencies of these target can be 
            processed all the same.

Depois de fazer as duas coisas para compilar o GCC 4.7.0 no GCC 6.2.1 em x86_64, parece compilar sem problemas, no entanto, no momento da escrita, a compilação não terminou.

    
por 08.01.2017 / 07:40
1

Concordo que usar um gcc mais novo geralmente não é uma boa opção. Eu tive que escrever um novo programa para um sistema ARM v4 embutido rodando o Pengutronix preso em um kernel 2.6 e um velho glibc. Portanto, eu tive que compilar o toolchain antigo no meu sistema.

Geralmente, versões mais recentes do GCC encontram erros no código-fonte, que estão presentes há algum tempo. Em vez de desativar a verificação de erros, aconselho corrigir o código-fonte.

De acordo com o log de erros, a declaração da função e o cabeçalho da função não correspondem a

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

no arquivo cfns.h incluído em except.c

Edite cfns.h e altere a declaração da função

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

para

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

A compilação deve funcionar.

    
por 02.10.2018 / 11:41