Error de compilación: "g ++: error al intentar ejecutar 'cc1plus': execvp: no existe tal archivo o directorio"

95

Cuando compilo el programa C / C ++ con popenin php... me sale este error:

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

pero si ejecuto el código php en shell ... funciona bien ...

en 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;
?>

Gracias

Fan de Zeyi
fuente
2
¿Ha intentado imprimir variables env y compararlas? ¿Tiene el modo seguro activado o desactivado?
Vyktor
sí ... comparé las variables env entre php y shell ... pero no tiene ninguna ayuda ... y mi modo seguro está desactivado ..
Zeyi Fan
¿Está utilizando el mismo usuario o ejecutando un script desde el servidor web? Agregue "-v" (debería ser una salida detallada), tal vez haya una respuesta.
Vyktor
ok ... acabo de probar para compilar código C ++ y ejecutarlo php xx.phpcomo httpusuario. todos ellos tienen éxito ... y la salida de g++ -ven código php es similar con su en shell ..
Zeyi Fan
1
gcc -print-search-dirs¿Qué tal esto? ¿Son iguales las salidas ?
Vyktor

Respuestas:

120

Necesitas instalar el gcc-c++paquete.

yum install gcc-c++
hahakubile
fuente
27
para alpine, esto fueapk add g++
shadi
45

No sé por qué, pero acabo de cambiar el nombre de mi archivo fuente COLARR.C a colarr.cy ¡el error desapareció! probablemente necesites esto

sudo apt-get install g++
Sunil Kumar
fuente
2
Tenga en cuenta que la .Cextensión en mayúsculas es una de varias convenciones para la fuente C ++, .cppy .ccson otras dos. La .Cconvención de mayúsculas interactúa mal con los sistemas de archivos que no distinguen entre mayúsculas y minúsculas (Windows, macOS, por ejemplo). Cuando lo hizo COLARR.C, el sistema probablemente lo estaba viendo como un archivo fuente C ++; ya colarr.cque es un archivo fuente en C.
Jonathan Leffler
23

Este problema puede ocurrir si se instalan diferentes versiones de g ++ y gcc.

   g++ --version
   gcc --version

Si estos no dan el resultado, probablemente tenga instaladas varias versiones de gcc. Puede verificar usando:

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

Por lo general, / usr / bin / gcc estará vinculado de forma simbólica a / etc / alternativas / gcc, que de nuevo está vinculado de forma simbólica para decir /usr/bin/gcc-4.6 o /usr/bin/gcc-4.8 (en caso de que tenga gcc-4.6, gcc-4.8 instalados).

Al cambiar este enlace, puede hacer que gcc y g ++ se ejecuten en la misma versión y esto puede resolver su problema.

pulkitag
fuente
Esto no resuelve el problema, no encontré la manera de cambiar estos enlaces.
Brana
Funcionó y el error desaparece después de modificar el enlace suave de / etc / alternativas / gcc de / usr / bin / gcc72 a / usr / bin / gcc48 con ln -fs / usr / bin / gcc48 / etc / alternativas / gcc .
buxizhizhoum
7

Cada compilador tiene su propio directorio libexec /. Normalmente, el directorio libexec contiene pequeños programas auxiliares llamados por otros programas. En este caso, gcc está buscando su propio compilador 'cc1'. Su máquina puede contener diferentes versiones de gcc, y cada versión debe tener su propio 'cc1'. Normalmente, estos compiladores se encuentran en:


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

Ruta similar para g ++. El error anterior significa que la versión actual de gcc utilizada no puede encontrar su propio compilador 'cc1'. Esto normalmente apunta a un problema PATH.

Freddy
fuente
Tuve el mismo problema con mi entorno PATH cuando ejecuté strace g++ [args], descubrí que estaba probando la carpeta incorrecta en la ruta y luego me rendí.
sirbrialliance
2

Tuve el mismo problema al bifurcar con 'python'; la razón principal es que la ruta de búsqueda es relativa, si no llama g++como /usr/bin/g++, no podrá determinar las rutas canónicas para llamar cc1plus.

vliu
fuente
0

Tuve el mismo problema con gcc "gnat1" y se debió a que la ruta estaba mal. Gnat1 estaba en la versión 4.6 pero estaba ejecutando la versión 4.8.1, que había instalado. Como solución temporal, copié gnat1 de 4.6 y lo pegué en la carpeta 4.8.1.

La ruta a gcc en mi computadora es / usr / lib / gcc / i686-linux-gnu /

Puede encontrar la ruta usando el comando de búsqueda:

find /usr -name "gnat1"

En su caso, buscaría cc1plus:

find /usr -name "cc1plus"

Por supuesto, esta es una solución rápida y una respuesta más sólida sería arreglar el camino roto.

rtrigoso
fuente
0

Instale g ++ en openSuSE run

zypper in gcc-c++
David Hamner
fuente
0

Algo salió mal con la instalación de GCC . Intente reinstalarlo así:

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

En Ubuntu, g++es un paquete de dependencia que instala la versión predeterminada deg++ para su versión de sistema operativo. Entonces, simplemente quitar e instalar el paquete nuevamente no funcionará, ya que instalará la versión predeterminada. Es por eso que necesita reinstalar.

Nota: puede reemplazar el g++-5con la g++versión que desee . Para encontrar su g++versión actual , ejecute esto:

g++ --version
tsveti_iko
fuente
0

También puede tener este problema si tiene la variable de entorno GCC_ROOT apuntando a una ubicación incorrecta. Probablemente la solución más simple podría ser (en un sistema similar a * nix):

unset GCC_ROOT

en casos más complicados, es posible que deba volver a apuntar a la ubicación adecuada

Slava
fuente