Błąd kompilacji: „g ++: błąd podczas próby wykonania„ cc1plus ”: execvp: nie ma takiego pliku lub katalogu”

99

Kiedy kompiluję program popenw C / C ++ z in php... otrzymałem ten błąd:

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

ale jeśli uruchomię kod php w powłoce… to działa dobrze…

w Arch Linux ..

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

dzięki

Zeyi Fan
źródło
2
Czy próbowałeś wydrukować zmienne env i porównać je? Czy masz włączony czy wyłączony tryb bezpieczny?
Vyktor
tak .. Porównałem zmienne env między php i powłoką ... ale to nie pomaga ... a mój tryb awaryjny jest wyłączony ..
Zeyi Fan,
Czy używasz tego samego użytkownika lub wykonujesz skrypt z serwera WWW? Dodaj „-v” (powinno być szczegółowym wyjściem), być może będzie odpowiedź.
Vyktor
ok .. właśnie przetestowałem kompilację kodu w C ++ i uruchomienie php xx.phpjako httpużytkownik. wszystkie z nich jest sukces ... a wyjście g++ -vw kodzie PHP jest podobny w skorupkach z ..
Zeyi Fan
1
gcc -print-search-dirsco powiesz na to? Czy wyjścia są takie same ?
Vyktor

Odpowiedzi:

126

Musisz zainstalować gcc-c++pakiet.

yum install gcc-c++
hahakubile
źródło
29
dla alpejskich był toapk add g++
shadi
50

Nie wiem dlaczego, ale właśnie zmieniłem nazwę mojego pliku źródłowego COLARR.C na colarr.c i błąd zniknął! prawdopodobnie tego potrzebujesz

sudo apt-get install g++
Sunil Kumar
źródło
2
Zauważ, że .Crozszerzenie pisane wielkimi literami jest jedną z wielu konwencji dla źródeł C ++ - .cppi .ccsą dwie inne. Górnym przypadków .Ckonwencji współdziała źle z systemów plików z opcją niewrażliwe (Windows, MacOS, na przykład). Kiedy to robiłeś COLARR.C, system prawdopodobnie patrzył na to jako plik źródłowy C ++; as colarr.c, jest to plik źródłowy C.
Jonathan Leffler
23

Ten problem może wystąpić, jeśli są zainstalowane różne wersje g ++ i gcc.

   g++ --version
   gcc --version

Jeśli to nie daje rezultatu, prawdopodobnie masz zainstalowanych kilka wersji gcc. Możesz to sprawdzić za pomocą:

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

Zwykle / usr / bin / gcc będzie dowiązane symbolicznie do / etc / alternatives / gcc, które jest ponownie połączone symbolicznie z, powiedzmy /usr/bin/gcc-4.6 lub /usr/bin/gcc-4.8 (w przypadku, gdy masz Zainstalowano gcc-4.6, gcc-4.8).

Zmieniając ten link, możesz sprawić, by gcc i g ++ działały w tej samej wersji, co może rozwiązać Twój problem!

pulkitag
źródło
To nie rozwiązuje problemu, nie znalazłem sposobu na zmianę tych linków.
Brana
Zadziałało, a błąd znika po zmodyfikowaniu linku programowego / etc / alternatives / gcc z / usr / bin / gcc72 do / usr / bin / gcc48 za pomocą ln -fs / usr / bin / gcc48 / etc / alternatives / gcc .
buxizhizhoum
7

Każdy kompilator ma swój własny katalog libexec /. Zwykle katalog libexec zawiera małe programy pomocnicze wywoływane przez inne programy. W tym przypadku gcc szuka własnego kompilatora „cc1”. Twój komputer może zawierać różne wersje gcc, a każda wersja powinna mieć swoje własne „cc1”. Zwykle te kompilatory znajdują się na:


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

Podobna ścieżka dla g ++. Powyższy błąd oznacza, że ​​aktualnie używana wersja gcc nie jest w stanie znaleźć własnego kompilatora „cc1”. Zwykle wskazuje to na problem ze ścieżką.

Freddy
źródło
Miałem ten sam problem z moim środowiskiem PATH, kiedy uruchomiłem strace g++ [args], odkryłem, że próbowałem niewłaściwego folderu w ścieżce, a potem się poddałem.
sirbrialliance
2

Miałem ten sam problem podczas rozwidlania z „pythonem”; głównym powodem jest to, że ścieżka wyszukiwania jest względna, jeśli nie wywołasz g++as /usr/bin/g++, nie będzie w stanie określić kanonicznych ścieżek do wywołania cc1plus.

vliu
źródło
0

Miałem ten sam problem z gcc "gnat1" i był on spowodowany błędną ścieżką. Gnat1 był w wersji 4.6, ale wykonywałem wersję 4.8.1, którą zainstalowałem. Jako rozwiązanie tymczasowe skopiowałem gnat1 z wersji 4.6 i wkleiłem do folderu 4.8.1.

Ścieżka do gcc na moim komputerze to / usr / lib / gcc / i686-linux-gnu /

Możesz znaleźć ścieżkę za pomocą polecenia find:

find /usr -name "gnat1"

W twoim przypadku poszukałbyś cc1plus:

find /usr -name "cc1plus"

Oczywiście jest to szybkie rozwiązanie, a solidniejszą odpowiedzią byłoby naprawienie zepsutej ścieżki.

rtrigoso
źródło
0

Zainstaluj g ++ przy uruchomieniu openSuSE

zypper in gcc-c++
David Hamner
źródło
0

Coś poszło nie tak z instalacją GCC . Spróbuj ponownie zainstalować to w następujący sposób:

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

W Ubuntu g++jest to pakiet zależności, który instaluje domyślną wersję g++dla twojej wersji systemu operacyjnego. Dlatego samo usunięcie i ponowne zainstalowanie pakietu nie zadziała, ponieważ zainstaluje wersję domyślną. Dlatego musisz ponownie zainstalować.

Uwaga: możesz zastąpić g++-5żądaną g++wersję. Aby znaleźć aktualną g++wersję, uruchom to:

g++ --version
tsveti_iko
źródło
0

Możesz mieć ten problem również, jeśli zmienna środowiskowa GCC_ROOT wskazuje niewłaściwą lokalizację. Prawdopodobnie najprostszą poprawką może być (w systemie podobnym do * nix):

unset GCC_ROOT

w bardziej skomplikowanych przypadkach może zajść potrzeba przeniesienia go we właściwe miejsce

Slava
źródło