Kompilierungsfehler: "g ++: Fehler beim Ausführen von 'cc1plus': execvp: Keine solche Datei oder kein solches Verzeichnis"


95

Beim Kompilieren des C / C ++ - Programms mit popenin php... wurde folgende Fehlermeldung angezeigt:

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

aber wenn ich PHP-Code in der Shell ausführen .. funktioniert es gut ..

in Arch Linux ..

PHP-Code:

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

Vielen Dank


2
Haben Sie versucht, env-Variablen zu drucken und zu vergleichen? Haben Sie den abgesicherten Modus ein- oder ausgeschaltet?
Vyktor

Ja .. Ich habe die Env-Variablen zwischen PHP und Shell verglichen ... aber es hat keine Hilfe ... und mein abgesicherter Modus ist Aus ..
Zeyi Fan

Verwenden Sie denselben Benutzer oder führen Sie ein Skript vom Webserver aus? Fügen Sie "-v" hinzu (sollte eine ausführliche Ausgabe sein), möglicherweise gibt es eine Antwort.
Vyktor

ok .. ich habe gerade getestet, um C ++ - Code zu kompilieren und php xx.phpals httpBenutzer auszuführen . Alle von ihnen sind Erfolg ... und die Ausgabe von g++ -vin PHP-Code ist ähnlich wie in Shell.
Zeyi Fan

1
gcc -print-search-dirsWie wäre es damit? Sind die Ausgänge gleich ?
Vyktor

Antworten:


120

Sie müssen das gcc-c++Paket installieren .

yum install gcc-c++

27
für alpine war diesapk add g++
Shadi

45

Ich weiß nicht warum, aber ich habe gerade meine Quelldatei COLARR.C in colarr.c umbenannt und der Fehler ist verschwunden! wahrscheinlich brauchst du das

sudo apt-get install g++

2
Beachten Sie, dass die .CErweiterung in Großbuchstaben eine von mehreren Konventionen für C ++ - Quellen ist - .cppund .cczwei weitere. Die Großbuchstabenkonvention .Cinteragiert schlecht mit Dateisystemen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird (z. B. Windows, macOS). Wenn Sie dies getan haben COLARR.C, hat das System es wahrscheinlich als C ++ - Quelldatei angesehen. as colarr.cist eine C-Quelldatei.
Jonathan Leffler

23

Dieses Problem kann auftreten, wenn verschiedene Versionen von g ++ und gcc installiert sind.

   g++ --version
   gcc --version

Wenn diese nicht zum Ergebnis führen, sind wahrscheinlich mehrere Versionen von gcc installiert. Sie können Folgendes überprüfen:

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

Normalerweise wird / usr / bin / gcc mit / etc / alternatives / gcc verknüpft, was wiederum mit /usr/bin/gcc-4.6 oder /usr/bin/gcc-4.8 verknüpft ist (falls vorhanden) gcc-4.6, gcc-4.8 installiert.)

Durch Ändern dieses Links können Sie gcc und g ++ in derselben Version ausführen lassen, wodurch Ihr Problem möglicherweise behoben wird!


Dies löst das Problem nicht. Ich habe keine Möglichkeit gefunden, diese Links zu ändern.
Brana

Es hat funktioniert und der Fehler verschwindet, nachdem ich den Softlink von / etc / alternatives / gcc von / usr / bin / gcc72 zu / usr / bin / gcc48 mit ln -fs / usr / bin / gcc48 / etc / alternatives / gcc geändert habe .
Buxizhizhoum

7

Jeder Compiler hat ein eigenes libexec / -Verzeichnis. Normalerweise enthält das libexec-Verzeichnis kleine Hilfsprogramme, die von anderen Programmen aufgerufen werden. In diesem Fall sucht gcc nach einem eigenen 'cc1'-Compiler. Ihr Computer enthält möglicherweise verschiedene Versionen von gcc, und jede Version sollte ihre eigene 'cc1' haben. Normalerweise befinden sich diese Compiler auf:


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

Ähnlicher Pfad für g ++. Der obige Fehler bedeutet, dass die aktuell verwendete gcc-Version keinen eigenen 'cc1'-Compiler finden kann. Dies weist normalerweise auf ein PATH-Problem hin.


Ich hatte das gleiche Problem mit meiner PATH-Umgebung, als ich sie ausführte. strace g++ [args]Ich stellte fest, dass sie den falschen Ordner im Pfad versuchte und dann aufgab.
Sirbrialliance

2

Ich hatte das gleiche Problem beim Gabeln mit 'Python'; Der Hauptgrund ist, dass der Suchpfad relativ ist. Wenn Sie nicht g++als aufrufen, kann er die aufzurufenden /usr/bin/g++kanonischen Pfade nicht ermitteln cc1plus.


0

Ich hatte das gleiche Problem mit gcc "gnat1" und es lag daran, dass der Pfad falsch war. Gnat1 war auf Version 4.6, aber ich führte Version 4.8.1 aus, die ich installiert hatte. Als vorübergehende Lösung habe ich gnat1 aus 4.6 kopiert und in den Ordner 4.8.1 eingefügt.

Der Pfad zu gcc auf meinem Computer lautet / usr / lib / gcc / i686-linux-gnu /

Sie können den Pfad mit dem Befehl find finden:

find /usr -name "gnat1"

In Ihrem Fall würden Sie nach cc1plus suchen:

find /usr -name "cc1plus"

Dies ist natürlich eine schnelle Lösung, und eine fundiertere Antwort wäre, den unterbrochenen Pfad zu beheben.



0

Bei Ihrer GCC- Installation ist ein Fehler aufgetreten. Versuchen Sie, es wie folgt neu zu installieren:

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

In Ubuntu g++ist dies ein Abhängigkeitspaket, das die Standardversion von g++für Ihre Betriebssystemversion installiert . Das einfache Entfernen und erneute Installieren des Pakets funktioniert also nicht, da die Standardversion installiert wird. Deshalb müssen Sie neu installieren.

Hinweis: Sie können die g++-5durch Ihre gewünschte g++Version ersetzen . Um Ihre aktuelle g++Version zu finden, führen Sie Folgendes aus:

g++ --version

0

Möglicherweise tritt dieses Problem auch auf, wenn die Umgebungsvariable GCC_ROOT auf einen falschen Speicherort verweist. Die wahrscheinlich einfachste Lösung könnte sein (auf einem * nix-ähnlichen System):

unset GCC_ROOT

In komplizierteren Fällen müssen Sie es möglicherweise an der richtigen Stelle neu platzieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.