Erro de compilação: “g ++: erro ao tentar executar 'cc1plus': execvp: arquivo ou diretório inexistente”

95

Quando compilo o programa C / C ++ com popenin php..., recebo este erro:

g++: error trying to exec 'cc1plus': execvp: No such file or directory

mas se eu executar o código php no shell .. funciona bem ..

no Arch Linux ..

Código PHP:

<?php
    function rfile($fp) {
    $out="";
       while (!feof($fp)) {
           $out.= fgets($fp, 1024000);
       }
       return $out;
    }
    $p = popen('g++ -Wall -g aplusb.cc -o aplusb 2>&1', 'r');
    $result = rfile($p);
    pclose($p);
    echo $result;
?>

obrigado

Zeyi Fan
fonte
2
Você tentou imprimir variáveis ​​env e compará-las? Você tem o modo de segurança ativado ou desativado?
Vyktor
sim .. Eu comparei as variáveis ​​env entre php e shell ... mas não tem nenhuma ajuda ... e meu modo de segurança está desligado ..
Zeyi Fan
Você está usando o mesmo usuário ou executando o script do servidor web? Adicione "-v" (deve ser uma saída detalhada), talvez haja uma resposta.
Vyktor
ok .. acabei de testar compilar o código C ++ e executar php xx.phpcomo httpusuário. todos eles são um sucesso ... e a saída do g++ -vcódigo php é semelhante ao do shell ..
Zeyi Fan
1
gcc -print-search-dirsque tal agora? As saídas são iguais ?
Vyktor

Respostas:

120

Você precisa instalar o gcc-c++pacote.

yum install gcc-c++
hahakubile
fonte
27
para alpino, isso eraapk add g++
shadi
45

Não sei por que, mas acabei de renomear meu arquivo de origem COLARR.C para colarr.c e o erro desapareceu! provavelmente você precisa disso

sudo apt-get install g++
Sunil Kumar
fonte
2
Observe que a .Cextensão em maiúsculas é uma das várias convenções para a origem C ++ - .cppe .cchá outras duas. A .Cconvenção de maiúsculas interage mal com sistemas de arquivos que não diferenciam maiúsculas de minúsculas (Windows, macOS, por exemplo). Quando você fez isso COLARR.C, o sistema provavelmente estava olhando para ele como um arquivo de origem C ++; como colarr.c, é um arquivo de origem C.
Jonathan Leffler
23

Este problema pode ocorrer se diferentes versões de g ++ e gcc estiverem instaladas.

   g++ --version
   gcc --version

Se eles não derem o resultado, você provavelmente tem várias versões do gcc instaladas. Você pode verificar usando:

    dpkg -l | grep gcc | awk '{print $2}'

Normalmente, / usr / bin / gcc será sym-linked a / etc / alternative / gcc que é novamente sym-linked para dizer /usr/bin/gcc-4.6 ou /usr/bin/gcc-4.8 (no caso de você ter gcc-4.6, gcc-4.8 instalado.)

Ao alterar este link, você pode fazer o gcc e g ++ rodarem na mesma versão e isso pode resolver o seu problema!

pulkitag
fonte
Isso não resolve o problema, não encontrei forma de alterar esses links.
Brana
Funcionou, e o erro desaparece depois que eu modifico o softlink de / etc / alternative / gcc de / usr / bin / gcc72 para / usr / bin / gcc48 com ln -fs / usr / bin / gcc48 / etc / backups / gcc .
buxizhizhoum
7

Cada compilador possui seu próprio diretório libexec /. Normalmente, o diretório libexec contém pequenos programas auxiliares chamados por outros programas. Neste caso, o gcc está procurando seu próprio compilador 'cc1'. Sua máquina pode conter diferentes versões do gcc, e cada versão deve ter seu próprio 'cc1'. Normalmente, esses compiladores estão localizados em:


/usr/local/libexec/gcc/<architecture>/<compiler>/<compiler_version>/cc1

Caminho semelhante para g ++. O erro acima significa que a versão atual do gcc usada não é capaz de encontrar seu próprio compilador 'cc1'. Isso normalmente aponta para um problema de PATH.

Freddy
fonte
Tive o mesmo problema com meu ambiente PATH quando executei strace g++ [args], descobri que ele estava tentando a pasta errada no caminho e desistindo.
sirbrialliance
2

Eu tive o mesmo problema ao fazer bifurcação com 'python'; o principal motivo é que o caminho de pesquisa é relativo, se você não chamar g++como /usr/bin/g++, não será possível descobrir os caminhos canônicos a serem chamados cc1plus.

vliu
fonte
0

Eu tive o mesmo problema com gcc "gnat1" e foi devido ao caminho estar errado. Gnat1 estava na versão 4.6, mas eu estava executando a versão 4.8.1, que havia instalado. Como solução temporária, copiei o gnat1 do 4.6 e colei na pasta 4.8.1.

O caminho para o gcc no meu computador é / usr / lib / gcc / i686-linux-gnu /

Você pode encontrar o caminho usando o comando find:

find /usr -name "gnat1"

No seu caso, você procuraria cc1plus:

find /usr -name "cc1plus"

Claro, esta é uma solução rápida e uma resposta mais sólida seria consertar o caminho quebrado.

rtrigoso
fonte
0

Instale o g ++ na execução do openSuSE

zypper in gcc-c++
David Hamner
fonte
0

Algo deu errado com a instalação do GCC . Tente reinstalá-lo assim:

sudo apt-get install --reinstall g++-5

No Ubuntu, g++é um pacote de dependência que instala a versão padrão do g++para sua versão do sistema operacional. Portanto, simplesmente remover e instalar o pacote novamente não funcionará, pois ele instalará a versão padrão. É por isso que você precisa reinstalar.

Nota: Você pode substituir o g++-5com a g++versão desejada . Para encontrar sua g++versão atual, execute o seguinte:

g++ --version
tsveti_iko
fonte
0

Você também pode ter esse problema se tiver a variável de ambiente GCC_ROOT apontando para um local errado. Provavelmente a correção mais simples poderia ser (em um sistema semelhante a * nix):

unset GCC_ROOT

em casos mais complicados, você pode precisar recolocá-lo no local adequado

Slava
fonte