Eu quero fazer uso de uma versão mais recente do GCC. Portanto, compilei o GCC 10 e instalei-o em um diretório não padrão /software/gcc10/
. Até agora tudo bem.
No entanto, estou enfrentando problemas quando realmente quero usar esta nova versão do GCC. Modifiquei minha PATH
variável para incluir /software/gcc10/bin/
tal que gcc --version
agora confirma que o sistema encontra meu novo compilador GCC 10 (em vez do GCC 8 do meu sistema).
No entanto, quando tento compilar um programa com essa configuração, recebo erros sobre referências indefinidas a std::filesystem
, que devem fazer parte do libstdc++ do GCC 10. Minha suposição aqui é que, enquanto estou usando um compilador mais recente, o vinculador ainda deseja vincular o libstdc++ do meu sistema em vez do /software/gcc10/lib64
.
Eu tentei mudar LD_LIBRARY_PATH
para incluir o respectivo diretório, mas isso não parece ter nenhum efeito.
Inspecionando a saída da execução gcc
com a -v
opção, me deparei com a LIBRARY_PATH
variável de ambiente, que de acordo com a documentação do gcc é usada da seguinte forma:
O valor de LIBRARY_PATH é uma lista de diretórios separados por dois pontos, muito parecido com PATH. Quando configurado como um compilador nativo, o GCC tenta os diretórios assim especificados ao procurar arquivos de linker especiais, se não conseguir encontrá-los usando GCC_EXEC_PREFIX. A vinculação usando o GCC também usa esses diretórios ao procurar bibliotecas comuns para a opção -l (mas os diretórios especificados com -L vêm primeiro).
E, de fato: Definir a LIBRARY_PATH
variável de acordo me permite compilar meu programa com sucesso. No entanto, parece que esta é uma solução específica do gcc e não posso deixar de me perguntar se existe uma maneira mais padrão de fazer isso (que, por exemplo, também diria ao clang onde procurar a biblioteca padrão C++ para vincular)?
Ainda melhor seria uma solução que faria com que meu novo compilador GCC 10 sempre usasse o GCC 10 stdlib, enquanto a invocação do compilador GCC 8 do sistema sempre se vincularia aos sistemas GCC 8 stdlib. Existe uma maneira de dizer a um binário de compilador específico que ele possui um stdlib específico que ele deve usar?
A
LIBRARY_PATH
variável de ambiente é bastante padrão. É conhecido pela maioria dos compiladores.Você também deve usar
C_INCLUDE_PATH
e/ouCPLUS_INCLUDE_PATH
. Esses dois são mais específicos do gcc (outros compiladores preferemINCLUDE
sem separação de linguagem).Você também pode ignorar completamente as variáveis de ambiente e especificar a libstdc++ correta diretamente na linha de comando.