compilação do gcc terminada com “erro fatal: string: Nenhum arquivo ou diretório #include string”

2

Minha situação. uname -aLinux computer2 4.4.0-62-generic #83~14.04.1-Ubuntu SMP Wed Jan 18 18:10:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Estou tentando instalar o HDF5 1.8.18 com o GNU make 3.81 invocando o gcc 6.3.0 . Eu instalei com sucesso este gcc 6.3.0 ao lado da versão 4.8.4 que é fornecida com a distribuição Ubuntu.

Meu gcc 6.3.0 mora em /opt/gcc/6_3_0/ . Eu uso o seguinte script para configurar e passar os comandos, bibliotecas e cabeçalhos em diretórios não padrão:

export FC='/opt/gcc/6_3_0/bin/gfortran-6.3.0'   # probably unnecessary
export CC='/opt/gcc/6_3_0/bin/gcc-6.3.0'  
export CXX='/opt/gcc/6_3_0/bin/g++-6.3.0' 
export CPP='/opt/gcc/6_3_0/bin/cpp-6.3.0'
export LDFLAGS='-L/opt/gcc/6_3_0/lib -L/opt/gcc/6_3_0/lib64' 
export CPPFLAGS='-I/opt/gcc/6_3_0/include -I/opt/gcc/6_3_0/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include'

./configure \
--prefix=${insdir} \
--with-zlib=${zlibdir}/include,${zlibdir}/lib \
--enable-fortran \
--enable-cxx

onde ${insdir} é um diretório de instalação, ${zlibdir} é o local onde o zlib mora e os outros switches são padrões de acordo com o diretrizes de instalação

A etapa de configuração vai bem. O passo do make falha com o erro:

make[2]: Entering directory '<the source directory>/hdf5-1.8.18/c++/src'
CXX      H5Exception.lo
H5Exception.cpp:16:18: fatal error: string: No such file or directory
#include <string>
                ^
compilation terminated

Se eu entendi corretamente, falta algum arquivo de cabeçalho e de natureza básica.

  • Onde devo obtê-lo?
  • Existe alguma falha nos nomes e valores das variáveis de ambiente?

O StackExchange contém uma série de postagens sobre esse erro , mas eles parecem estar relacionados principalmente a exercícios de codificação. Meu objetivo não é editar códigos, e sim compilar códigos fontes com sucesso com o meu vanilla gcc 6.3.0.

Pergunta atualizada

À luz dos comentários úteis e da resposta de Thomas Dickey abaixo, parece que uma alternativa promissora é instalar as versões correspondentes de libstdc++ e gcc . Pesquisei no site do GCC e parece que é possível configurar o gcc com a seguinte opção

--enable-version-specific-runtime-libs

Specify that runtime libraries should be installed in the compiler specific subdirectory (libdir/gcc) rather than the usual places. In addition, libstdc++'s include files will be installed into libdir unless you overruled it by using --with-gxx-include-dir=dirname. Using this option is particularly useful if you intend to use several versions of GCC in parallel. This is currently supported by ‘libgfortran’, ‘libstdc++’, and ‘libobjc’.

  • Isso está apontando na direção certa?
  • Onde eu deveria encontrar os arquivos de inclusão da libstdc ++ que são distribuídos ao lado da origem do gcc, se essa opção não for usada?
por XavierStuvw 19.02.2017 / 17:52

2 respostas

2

Isso está procurando um arquivo de cabeçalho C ++, normalmente parte de um pacote de desenvolvimento, como libstdc ++ (com uma versão e "-dev" ou "-devel" como parte do nome do pacote).

Por exemplo, no Debian (onde o Ubuntu obtém a maioria dos seus pacotes), eu tenho um "libstdc ++ 6-4.6-dev" em minha máquina Debian 7, que possui este arquivo:

/usr/include/c++/4.6/string

Os arquivos de cabeçalho C têm um sufixo .h ; C++ como regra, não (embora em alguns sistemas você possa ver .hh ).

Quando você configurou o compilador de complementos, ele usou configurações (consulte seus logs ...) que informaram onde esperar encontrar bibliotecas. Você provavelmente terá que construir seu próprio libstdc ++ para compatibilidade com o compilador mais novo. Novamente, você terá que definir a opção --prefix ao configurar, para que o compilador e a biblioteca trabalhem juntos.

Abordando um acompanhamento: se o seu compilador está procurando em /usr/local , então você poderia contornar isso alterando sua variável CPPFLAGS , adicionando /usr/include (e possivelmente /usr/include/c++/4.8 , etc.), embora também haja caminho da biblioteca em LDFLAGS a considerar). Para ver os nomes de caminho usados pelo seu pacote libstdc ++, use

dpkg -L $(dpkg -l | awk '{print $2}' |grep -E 'libstdc++.*dev')
    
por 19.02.2017 / 17:56
1

O que se segue é um caminho para uma solução. Estou em dívida com resposta de Thomas Dickey por ter me colocado na direção certa.

Problema

O problema é que o compilador gcc 6.3.0 não pode encontrar os arquivos da família libstdc++ contida em /usr/include/ na distribuição do Ubuntu.

Causa

No ponto de instalação, o próprio arquivo de configuração para o gcc 6.3.0 seguiu silenciosamente a especificação padrão para o diretório de destino onde encontrar os arquivos de cabeçalho locais (previamente instalados). Este padrão é /usr/local/include/ . Consulte o link para obter detalhes.

Corrigir

O compilador reinstalado com o ./configure --with-local-prefix=/usr criou um novo gcc que é capaz de buscar os arquivos necessários onde o Ubuntu os colocou. Nenhum ajuste adicional do CPPFLAGS é necessário em relação ao que foi mostrado na pergunta. No entanto, a configuração --with-local-prefix=/usr não é recomendada (consulte a citação no link ), portanto, essa é uma solução alternativa.

Verificar

O teste empírico para esta estratégia é que o make do HDF 1.8.18 prossegue onde uma vez foi encalhado. Todos os testes no make check são passados com sucesso.

Alternativas

Eu observei (ainda) explorar a outra maneira de instalar uma nova biblioteca libstdc++ que serve especificamente a instalação personalizada do gcc (switch --enable-version-specific-runtime-libs ). Eu levantei essa possibilidade no quadro de perguntas acima em busca de pistas. Isso pode muito bem ser uma solução mais robusta. O fio permanece aberto por enquanto. Obrigado por contribuir / editar

    
por 19.02.2017 / 22:01