Erreur de compilation: «g ++: erreur lors de la tentative d’exécution de« cc1plus »: execvp: aucun fichier ou répertoire de ce type»

95

Lorsque je compile un programme C / C ++ avec popenin php... j'ai cette erreur:

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

mais si j'exécute du code php dans le shell .. cela fonctionne bien ..

dans Arch Linux.

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

Merci

Fan de Zeyi
la source
2
Avez-vous essayé d'imprimer des variables d'environnement et de les comparer? Avez-vous activé ou désactivé le mode sans échec?
Vyktor le
oui .. J'ai comparé les variables d'environnement entre php et shell ... mais il n'a aucune aide ... et mon mode sans échec est désactivé ..
Zeyi Fan
Utilisez-vous le même utilisateur ou exécutez-vous un script à partir du serveur Web? Ajoutez "-v" (devrait être une sortie verbeuse), il y aura peut-être une réponse.
Vyktor le
ok .. je viens de tester pour compiler le code C ++ et exécuter en php xx.phptant httpqu'utilisateur. tous sont un succès ... et la sortie du g++ -vcode en php est similaire avec son en shell ..
Zeyi Fan
1
gcc -print-search-dirsque dis-tu de ça? Les sorties sont-elles les mêmes ?
Vyktor le

Réponses:

120

Vous devez installer le gcc-c++package.

yum install gcc-c++
hahakubile
la source
27
pour alpin, c'étaitapk add g++
shadi
45

Je ne sais pas pourquoi mais je viens de renommer mon fichier source COLARR.C en colarr.c et l'erreur a disparu! tu en as probablement besoin

sudo apt-get install g++
Sunil Kumar
la source
2
Notez que l' .Cextension majuscule est l'une des nombreuses conventions pour la source C ++ - .cppet il en .ccexiste deux autres. La .Cconvention des majuscules interagit mal avec les systèmes de fichiers insensibles à la casse (Windows, macOS, par exemple). Quand vous aviez COLARR.C, le système le regardait probablement comme un fichier source C ++; car colarr.c, il s'agit d'un fichier source C.
Jonathan Leffler
23

Ce problème peut se produire si différentes versions de g ++ et gcc sont installées.

   g++ --version
   gcc --version

Si ceux-ci ne donnent pas le résultat, vous avez probablement plusieurs versions de gcc installées. Vous pouvez vérifier en utilisant:

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

Habituellement, / usr / bin / gcc sera lié symboliquement à / etc / alternatives / gcc qui est à nouveau lié symboliquement à /usr/bin/gcc-4.6 ou /usr/bin/gcc-4.8 (au cas où vous auriez gcc-4.6, gcc-4.8 installés.)

En modifiant ce lien, vous pouvez faire fonctionner gcc et g ++ dans la même version et cela peut résoudre votre problème!

pulkitag
la source
Cela ne résout pas le problème, je n'ai pas trouvé de moyen de modifier ces liens.
Brana
Cela a fonctionné, et l'erreur disparaît après avoir modifié le lien logiciel de / etc / alternatives / gcc de / usr / bin / gcc72 vers / usr / bin / gcc48 avec ln -fs / usr / bin / gcc48 / etc / alternatives / gcc .
buxizhizhoum
7

Chaque compilateur a son propre répertoire libexec /. Normalement, le répertoire libexec contient de petits programmes d'aide appelés par d'autres programmes. Dans ce cas, gcc recherche son propre compilateur 'cc1'. Votre machine peut contenir différentes versions de gcc, et chaque version doit avoir son propre «cc1». Normalement, ces compilateurs sont situés sur:


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

Chemin similaire pour g ++. L'erreur ci-dessus signifie que la version actuelle de gcc utilisée n'est pas capable de trouver son propre compilateur 'cc1'. Cela indique normalement un problème PATH.

Freddy
la source
J'ai eu le même problème avec mon environnement PATH lorsque j'ai couru, strace g++ [args]j'ai découvert qu'il essayait le mauvais dossier dans le chemin, puis abandonnait.
sirbrialliance
2

J'ai eu le même problème en forçant avec «python»; la raison principale est que le chemin de recherche est relatif, si vous n'appelez pas en g++tant que /usr/bin/g++, il ne pourra pas trouver les chemins canoniques à appeler cc1plus.

vliu
la source
0

J'ai eu le même problème avec gcc "gnat1" et c'était dû à un chemin erroné. Gnat1 était sur la version 4.6 mais j'exécutais la version 4.8.1, que j'avais installée. Comme solution temporaire, j'ai copié gnat1 à partir de 4.6 et collé sous le dossier 4.8.1.

Le chemin de gcc sur mon ordinateur est / usr / lib / gcc / i686-linux-gnu /

Vous pouvez trouver le chemin en utilisant la commande find:

find /usr -name "gnat1"

Dans votre cas, vous recherchez cc1plus:

find /usr -name "cc1plus"

Bien sûr, c'est une solution rapide et une réponse plus solide serait de réparer le chemin cassé.

rtrigoso
la source
0

Installer g ++ lors de l'exécution d'openSuSE

zypper in gcc-c++
David Hamner
la source
0

Un problème est survenu avec votre installation GCC . Essayez de le réinstaller comme ceci:

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

Dans Ubuntu, il g++s'agit d'un package de dépendances qui installe la version par défaut de g++pour la version de votre système d'exploitation. Donc, simplement supprimer et réinstaller le package ne fonctionnera pas, car il installera la version par défaut. C'est pourquoi vous devez réinstaller.

Remarque: vous pouvez remplacer le g++-5par la g++version souhaitée . Pour trouver votre g++version actuelle , exécutez ceci:

g++ --version
tsveti_iko
la source
0

Vous pouvez également avoir ce problème si vous avez la variable d'environnement GCC_ROOT pointant vers un mauvais emplacement. La solution la plus simple pourrait probablement être (sur un système similaire à * nix):

unset GCC_ROOT

dans les cas plus compliqués, vous devrez peut-être le rejoindre au bon endroit

Slava
la source