2012-01-16 31 views
63

Cuando compilo programa en C/C++ con popen en php ... Tengo este error:error de compilación: "g ++: error al intentar exec 'cc1plus': execvp: No existe el fichero o directorio"

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

pero si corro código php con cáscara .. 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

+2

¿Ha tratado de imprimir las variables env y compararlos? ¿Tiene el modo seguro activado o desactivado? – Vyktor

+0

sí ... Comparé las variables de env entre php y shell ... pero no tiene ayuda ... y mi modo seguro está desactivado ... –

+0

¿Está usando el mismo usuario o está ejecutando script desde el servidor web? Agregar "-v" (debería ser una salida detallada), tal vez habrá una respuesta. – Vyktor

Respuesta

74

Necesita instalar el paquete gcc-c++.

yum install gcc-c++ 
+3

para alpine, esto fue 'apk add g ++' – shadi

6

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 propia '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 no puede encontrar su propio compilador 'cc1'. Esto normalmente apunta a un problema de PATH.

+0

Tuve el mismo problema con mi entorno PATH cuando ejecuté 'strace g ++ [args]' Descubrí que estaba intentando con la carpeta incorrecta en el camino y luego me daba por vencida. – sirbrialliance

0

Tuve el mismo problema con gcc "gnat1" y fue debido a que la ruta era incorrecta. 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 pegué debajo de la carpeta 4.8.1.

El camino a gcc en mi equipo es/usr/lib/gcc/i686-linux-gnu/

Usted puede encontrar la ruta con el comando find:

find /usr -name "gnat1" 

En su caso que se busca cc1plus:

find /usr -name "cc1plus" 

por supuesto, esta es una solución rápida y una respuesta más sólida sería la fijación de la ruta roto.

27

No sé por qué, pero acabo de cambiar el nombre de mi archivo fuente COLARR.C a colarr.c y el error desapareció. probablemente necesita esta

sudo apt-get install g++ 
+0

Tenga en cuenta que la extensión '.C' en mayúscula es una de las convenciones para fuente de C++ -' .cpp' y '.cc' son otras dos. La convención en mayúscula '.C' interactúa mal con los sistemas de archivos que no distinguen entre mayúsculas y minúsculas (Windows, macOS, por ejemplo). Cuando tenía 'COLARR.C', el sistema probablemente lo miraba como un archivo fuente de C++; como 'colarr.c', es un archivo fuente C. –

12

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

g++ --version 
    gcc --version 

Si estos no dan el resultado, es probable que tenga instaladas varias versiones de gcc. Se puede comprobar mediante el uso de:

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

Por lo general,/usr/bin/gcc se SYM-vinculados a/etc/alternatives/gcc que es más sim-ligado decir /usr/bin/gcc-4.6 o /usr/bin/gcc-4.8 (En caso de tener gcc-4.6, gcc-4.8 instalado.)

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

3

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

1

instalar g ++ en openSUSE ejecutar

zypper in gcc-c++ 
Cuestiones relacionadas