Derleme hatası: "g ++: 'cc1plus' yürütmeye çalışırken hata: execvp: Böyle bir dosya veya dizin yok"


99

C / C ++ programını popenin php... ile derlediğimde şu hatayı aldım:

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

ama kabukta php kodunu çalıştırırsam .. iyi çalışıyor ..

Arch Linux'ta ..

PHP Kodu:

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

Teşekkürler


2
Env değişkenlerini yazdırmayı ve karşılaştırmayı denediniz mi? Güvenli modunuz açık mı yoksa kapalı mı?
Vyktor

evet .. php ve shell arasındaki env değişkenlerini karşılaştırdım ... ama herhangi bir yardımı yok ... ve güvenli
modum

Aynı kullanıcıyı mı kullanıyorsunuz yoksa web sunucusundan komut dosyası mı çalıştırıyorsunuz? "-V" ekleyin (ayrıntılı çıktı olmalıdır), belki bir yanıt olabilir.
Vyktor

ok .. C ++ kodunu derlemek ve kullanıcı php xx.phpolarak çalıştırmak için test ettim http. hepsi başarılı ... ve g++ -vphp kodunun çıktısı kabuğundaki ile benzer.
Zeyi Fan

1
gcc -print-search-dirsbuna ne dersin? Çıktılar aynı mı?
Vyktor

Yanıtlar:


126

gcc-c++Paketi kurmanız gerekiyor .

yum install gcc-c++

29
Alp için, bu olduapk add g++
shadi

50

Nedenini bilmiyorum ama COLARR.C kaynak dosyamı colarr.c olarak yeniden adlandırdım ve hata ortadan kalktı! muhtemelen buna ihtiyacın var

sudo apt-get install g++

2
Büyük harfli .Cuzantının, C ++ kaynağı için bir dizi kuraldan biri .cppve .ccdiğer ikisi olduğunu unutmayın. Büyük harf .Ckuralı, büyük / küçük harfe duyarlı olmayan dosya sistemleriyle (örneğin Windows, macOS) kötü bir şekilde etkileşir. Sahip olduğunuzda COLARR.C, sistem muhtemelen ona bir C ++ kaynak dosyası olarak bakıyordu; gibi colarr.c, bir C kaynak dosyasıdır.
Jonathan Leffler

23

Bu sorun, g ++ ve gcc'nin farklı sürümleri kurulursa ortaya çıkabilir.

   g++ --version
   gcc --version

Bunlar sonucu vermiyorsa, muhtemelen birden fazla gcc sürümüne sahipsinizdir. Şunları kullanarak kontrol edebilirsiniz:

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

Genellikle, / usr / bin / gcc, / etc / alternatives / gcc ile sembolik bağlantılı olacaktır ve bu da /usr/bin/gcc-4.6 veya /usr/bin/gcc-4.8 ile sym-bağlantılı olacaktır ( gcc-4.6, gcc-4.8 yüklü.)

Bu bağlantıyı değiştirerek gcc ve g ++ 'nın aynı sürümde çalışmasını sağlayabilirsiniz ve bu, sorununuzu çözebilir!


Bu sorunu çözmüyor, bu bağlantıları değiştirmenin bir yolunu bulamadım.
Brana

İşe yaradı ve / etc / alternatives / gcc'nin yazılım bağlantısını / usr / bin / gcc72'den / usr / bin / gcc48'e ln -fs / usr / bin / gcc48 / etc / alternatives / gcc ile değiştirdikten sonra hata ortadan kalkıyor .
buxizhizhoum

7

Her derleyicinin kendi libexec / dizini vardır. Normalde libexec dizini diğer programlar tarafından çağrılan küçük yardımcı programları içerir. Bu durumda, gcc kendi 'cc1' derleyicisini arıyor. Makineniz farklı gcc sürümleri içerebilir ve her sürümün kendi 'cc1'i olmalıdır. Normalde bu derleyiciler şurada bulunur:


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

G ++ için benzer yol. Yukarıdaki hata, kullanılan mevcut gcc sürümünün kendi 'cc1' derleyicisini bulamadığı anlamına gelir. Bu normalde bir PATH sorununa işaret eder.


PATH ortamımla aynı sorunu yaşadığımda, strace g++ [args]yolda yanlış klasörü denediğini ve sonra pes ettiğini keşfettim.
sirbrialliance

2

'Python' ile çatallanırken aynı sorunu yaşadım; ana sebep, arama yolunun göreceli olmasıdır, eğer g++olarak çağırmazsanız /usr/bin/g++, arama için kanonik yolları hesaplayamayacaktır cc1plus.


0

Gcc "gnat1" ile aynı sorunu yaşadım ve yolun yanlış olmasından kaynaklanıyordu. Gnat1 4.6 sürümündeydi ama ben kurduğum 4.8.1 sürümünü çalıştırıyordum. Geçici bir çözüm olarak gnat1'i 4.6'dan kopyaladım ve 4.8.1 klasörünün altına yapıştırdım.

Bilgisayarımdaki gcc'ye giden yol / usr / lib / gcc / i686-linux-gnu /

Bul komutunu kullanarak yolu bulabilirsiniz:

find /usr -name "gnat1"

Sizin durumunuzda cc1plus ararsınız:

find /usr -name "cc1plus"

Tabii ki, bu hızlı bir çözüm ve daha sağlam bir cevap, bozuk yolu düzeltmek olacaktır.



0

GCC kurulumunuzla ilgili bir sorun oluştu . Dosyayı şu şekilde yeniden yüklemeyi deneyin:

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

Ubuntu'da, işletim sistemi sürümünüz için g++varsayılan sürümünü yükleyen bir bağımlılık paketidir g++. Bu yüzden paketi kaldırıp tekrar yüklemek işe yaramayacak, çünkü varsayılan sürümü kuracaktır. Bu yüzden yeniden yüklemeniz gerekiyor.

Not: g++-5İstediğiniz g++sürümle değiştirebilirsiniz . Mevcut g++sürümünüzü bulmak için şunu çalıştırın:

g++ --version

0

GCC_ROOT ortam değişkeninin yanlış bir konuma işaret etmesi durumunda da bu sorunu yaşayabilirsiniz. Muhtemelen en basit düzeltme şu olabilir (* nix benzeri bir sistemde):

unset GCC_ROOT

daha karmaşık durumlarda, onu uygun konuma yeniden yönlendirmeniz gerekebilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.