Kesalahan kompilasi: “g ++: kesalahan mencoba mengeksekusi 'cc1plus': execvp: Tidak ada file atau direktori seperti itu”

96

Ketika saya mengkompilasi program C / C ++ dengan popendi php... saya mendapat kesalahan ini:

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

tetapi jika saya menjalankan kode php di shell .. berfungsi dengan baik ..

di Arch Linux ..

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

Terima kasih

Zeyi Fan
sumber
2
Sudahkah Anda mencoba mencetak variabel env dan membandingkannya? Apakah Anda mengaktifkan atau menonaktifkan mode aman?
Vyktor
ya .. Saya membandingkan variabel env antara php dan shell ... tetapi tidak ada bantuan apa pun ... dan mode aman saya Mati ..
Zeyi Fan
Apakah Anda menggunakan pengguna yang sama atau menjalankan skrip dari server web? Tambahkan "-v" (harus berupa keluaran verbose), mungkin akan ada jawaban.
Vyktor
ok .. saya baru saja menguji untuk mengkompilasi kode C ++ dan dijalankan php xx.phpsebagai httppengguna. semuanya sukses ... dan keluaran g++ -vdalam kode php serupa dengan di shell ..
Zeyi Fan
1
gcc -print-search-dirsbagaimana dengan ini? Apakah hasilnya sama ?
Vyktor

Jawaban:

120

Anda perlu menginstal gcc-c++paket.

yum install gcc-c++
hahakubile
sumber
28
untuk alpine, iniapk add g++
shadi
46

Saya tidak tahu mengapa tetapi saya baru saja mengganti nama file sumber saya COLARR.C menjadi colarr.c dan kesalahan itu lenyap! mungkin Anda membutuhkan ini

sudo apt-get install g++
Sunil Kumar
sumber
2
Perhatikan bahwa .Cekstensi huruf besar adalah salah satu dari sejumlah konvensi untuk sumber C ++ - .cppdan .ccdua lainnya. .CKonvensi huruf besar berinteraksi buruk dengan sistem file tidak peka huruf besar / kecil (Windows, macOS, misalnya). Jika Anda memilikinya COLARR.C, sistem mungkin melihatnya sebagai file sumber C ++; sebagai colarr.c, ini adalah file sumber C.
Jonathan Leffler
23

Masalah ini dapat terjadi jika versi g ++ dan gcc yang berbeda diinstal.

   g++ --version
   gcc --version

Jika ini tidak memberikan hasil, Anda mungkin telah menginstal beberapa versi gcc. Anda dapat memeriksa dengan menggunakan:

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

Biasanya, / usr / bin / gcc akan dihubungkan dengan sym ke / etc / alternate / gcc yang juga ditautkan dengan sym ke mengatakan /usr/bin/gcc-4.6 atau /usr/bin/gcc-4.8 (Jika Anda memiliki gcc-4.6, gcc-4.8 diinstal.)

Dengan mengubah tautan ini, Anda dapat menjalankan gcc dan g ++ dalam versi yang sama dan ini dapat menyelesaikan masalah Anda!

pulkitag
sumber
Ini tidak menyelesaikan masalah, saya tidak menemukan cara untuk mengubah tautan ini.
Brana
Ini berhasil, dan kesalahan hilang setelah saya memodifikasi tautan lunak / etc / alternate / gcc dari / usr / bin / gcc72 ke / usr / bin / gcc48 dengan ln -fs / usr / bin / gcc48 / etc / alternate / gcc .
buxizhizhoum
7

Setiap kompilator memiliki direktori libexec / sendiri-sendiri. Biasanya direktori libexec berisi program pembantu kecil yang dipanggil oleh program lain. Dalam kasus ini, gcc mencari kompiler 'cc1' miliknya sendiri. Mesin Anda mungkin berisi versi gcc yang berbeda, dan setiap versi harus memiliki 'cc1' sendiri. Biasanya kompiler ini berada di:


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

Jalur serupa untuk g ++. Kesalahan di atas berarti, versi gcc saat ini yang digunakan tidak dapat menemukan kompiler 'cc1' sendiri. Ini biasanya mengacu pada masalah PATH.

Freddy
sumber
Saya memiliki masalah yang sama dengan lingkungan PATH saya ketika saya menjalankan strace g++ [args]saya menemukan itu mencoba folder yang salah di jalur kemudian menyerah.
sirbrialliance
2

Saya memiliki masalah yang sama saat melakukan forking dengan 'python'; alasan utamanya adalah bahwa jalur pencarian bersifat relatif, jika Anda tidak memanggilnya g++sebagai /usr/bin/g++, jalur tersebut tidak akan dapat menentukan jalur kanonik untuk dipanggil cc1plus.

vliu
sumber
0

Saya memiliki masalah yang sama dengan gcc "gnat1" dan itu karena jalur yang salah. Gnat1 menggunakan versi 4.6 tetapi saya menjalankan versi 4.8.1, yang telah saya instal. Sebagai solusi sementara, saya menyalin gnat1 dari 4.6 dan menempelkannya di bawah folder 4.8.1.

Jalur ke gcc di komputer saya adalah / usr / lib / gcc / i686-linux-gnu /

Anda dapat menemukan jalur dengan menggunakan perintah find:

find /usr -name "gnat1"

Dalam kasus Anda, Anda akan mencari cc1plus:

find /usr -name "cc1plus"

Tentu saja, ini adalah solusi cepat dan jawaban yang lebih solid adalah memperbaiki jalur yang rusak.

rtrigoso.dll
sumber
0

Instal g ++ saat menjalankan openSuSE

zypper in gcc-c++
David Hamner
sumber
0

Ada yang salah dengan Anda penginstalan GCC . Coba instal ulang seperti ini:

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

Di Ubuntu, g++adalah paket ketergantungan yang menginstal versi default g++untuk versi OS Anda. Jadi hanya menghapus dan menginstal paket lagi tidak akan berfungsi, karena itu akan menginstal versi default. Itulah mengapa Anda perlu menginstal ulang.

Catatan: Anda dapat mengganti g++-5dengan g++versi yang Anda inginkan . Untuk menemukan g++versi Anda saat ini, jalankan ini:

g++ --version
tsveti_iko
sumber
0

Anda mungkin mengalami masalah ini juga jika Anda memiliki variabel lingkungan GCC_ROOT yang mengarah ke lokasi yang salah. Mungkin perbaikan yang paling sederhana adalah (pada * nix like system):

unset GCC_ROOT

dalam kasus yang lebih rumit, Anda mungkin perlu mengarahkannya kembali ke lokasi yang tepat

Slava
sumber