gcc compila o gcc com o modelo de erros com ligação C 'e' especialização de modelo com ligação C '

1

Estou trabalhando com o Ubuntu 14.04 LTS. Isso já vem com um pacote gcc 4.8.4 mas eu queria ter uma versão posterior de gcc .

Usando a versão existente 4.8.4, eu construí a versão 4.9.4 do código-fonte através da recomendação chain compile-build-test-install . Não usei configurações exóticas para ./configure , exceto para um diretório de prefixo e um sufixo de programa. O resto é o padrão. Tudo parece ter corrido bem. O resumo do teste para g++ não mostra FAIL e apenas duas chamadas XPASS

XPASS: g++.dg/tls/thread_local-order2.C -std=c++11 execution test
XPASS: g++.dg/tls/thread_local-order2.C -std=c++1y execution test

Eu queria então construir a versão 5.4.0 usando o recém-instalado 4.9.4, para colocar o último em teste com uma curva mínima de aprendizado. Eu editei o mesmo script de instalação usado para 4.9.4 apenas especificando as make flags CC e CXX . Esses sinalizadores agora apontam para os binários no diretório de instalação 4.9.4.

O estágio configure para o 5.4.0 prossegue bem. Vejo dos arquivos config.log e Makefile que os caminhos dos novos binários são lidos corretamente.

O estágio build falha e o stderr informa cerca de 100 erros. Os mais antigos e mais recorrentes são do tipo

'error: template with C linkage'
'error: template specialization with C linkage'

Eles aparecem em padrões de blocos como este:

In file included from ${installation directory for 4.9.4}/include/c++/4.9.4/bits/stringfwd.h:40:0,
             from ${installation directory for 4.9.4}/include/c++/4.9.4/iosfwd:39,
             from /usr/include/x86_64-linux-gnu/gmp.h:25,
             from /usr/local/include/isl/val_gmp.h:4,
             from ${source directory for 5-4-0}/gcc/graphite-isl-ast-to-gimple.c:35:

${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:63:3: error: template with C linkage
   template<typename>
   ^
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:66:3: error: template specialization with C linkage
   template<>
   ^
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:70:3: error: template with C linkage
   template<typename, typename>
   ^

Eu acho que a fonte 5.4.0 está bem, já que todas as informações foram reunidas e processadas da mesma forma que foi para 4.9.4. Pode haver um erro / omissão no estágio de configuração de 4.9.4 ou 5.4.0 ou ambos.

Quais falhas esses erros indicam? Como você conserta eles?

Obrigado por pensar junto.

Uma consulta de pesquisa no StackExchange em error: template with C linkage fornece cerca de 171.000 resultados. As postagens que eu usei não parecem abordar esse ponto:

link

link

Note que não estou interessado em triar os códigos, mas em configurar um compilador (robusto) de trabalho.

    
por XavierStuvw 13.02.2017 / 11:38

1 resposta

0

O problema foi evitado configurando a opção de compilação --with-local-prefix=/usr do script de shell configure . O padrão é /usr/local , enquanto o Ubuntu parece armazenar os arquivos procurados em /usr . Isso corrigiu os erros fatais em outra compilação da origem do HDF5 (consulte link )

Esta configuração não é recomendada. Consulte a ajuda de configuração on-line do GCC :

--with-local-prefix=dirname

Specify the installation directory for local include files. The default is /usr/local. Specify this option if you want the compiler to search directory dirname/include for locally installed header files instead of /usr/local/include.

You should specify --with-local-prefix only if your site has a different convention (not /usr/local) for where to put site-specific files.

The default value for --with-local-prefix is /usr/local regardless of the value of --prefix. Specifying --prefix has no effect on which directory GCC searches for local header files. This may seem counterintuitive, but actually it is logical.

The purpose of --prefix is to specify where to install GCC. The local header files in /usr/local/include—if you put any in that directory—are not part of GCC. They are part of other programs—perhaps many others. (GCC installs its own header files in another directory which is based on the --prefix value.)

Both the local-prefix include directory and the GCC-prefix include directory are part of GCC’s “system include” directories. Although these two directories are not fixed, they need to be searched in the proper order for the correct processing of the include_next directive. The local-prefix include directory is searched before the GCC-prefix include directory. Another characteristic of system include directories is that pedantic warnings are turned off for headers in these directories.

Some autoconf macros add -I directory options to the compiler command line, to ensure that directories containing installed packages’ headers are searched. When directory is one of GCC’s system include directories, GCC will ignore the option so that system directories continue to be processed in the correct order. This may result in a search order different from what was specified but the directory will still be searched.

GCC automatically searches for ordinary libraries using GCC_EXEC_PREFIX. Thus, when the same installation prefix is used for both GCC and packages, GCC will automatically search for both headers and libraries. This provides a configuration that is easy to use. GCC behaves in a manner similar to that when it is installed as a system compiler in /usr.

Sites that need to install multiple versions of GCC may not want to use the above simple configuration. It is possible to use the --program-prefix, --program-suffix and --program-transform-name options to install multiple versions into a single directory, but it may be simpler to use different prefixes and the --with-local-prefix option to specify the location of the site-specific files for each version. It will then be necessary for users to specify explicitly the location of local site libraries (e.g., with LIBRARY_PATH).

The same value can be used for both --with-local-prefix and --prefix provided it is not /usr. This can be used to avoid the default search of /usr/local/include.

Do not specify /usr as the --with-local-prefix! The directory you use for --with-local-prefix must not contain any of the system’s standard header files. If it did contain them, certain programs would be miscompiled (including GNU Emacs, on certain targets), because this would override and nullify the header file corrections made by the fixincludes script.

Indications are that people who use this option use it based on mistaken ideas of what it is for. People use it as if it specified where to install part of GCC. Perhaps they make this assumption because installing GCC creates the directory.

Vou abordar essas inconsistências em outro post na primeira oportunidade.

    
por 03.03.2017 / 10:42