Помилка компіляції: “g ++: помилка при спробі виконати 'cc1plus': execvp: Немає такого файлу чи каталогу”


95

Коли я компілюю програму C / C ++ з popenin php..., я отримав цю помилку:

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

але якщо я запускаю php-код в оболонці .. він працює нормально ..

в Arch Linux ..

Код 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;
?>

Дякую


2
Ви намагалися надрукувати змінні env і порівняти їх? У вас безпечний режим увімкнено чи вимкнено?
Виктор

так .. Я порівняв змінні env між php та оболонкою ... але це не допомогло ... і мій безпечний режим вимкнено ..
Zeyi Fan

Ви використовуєте того самого користувача або виконуєте сценарій з веб-сервера? Додайте "-v" (має бути багатослівний вихід), можливо, буде відповідь.
Виктор

ок .. я просто перевірений для складання коду C ++ і запускається php xx.phpяк httpкористувач. всі вони - успіх ... а вихід g++ -vу php-коді схожий на оболонку ..
Zeyi Fan

1
gcc -print-search-dirsяк щодо цього? Виходи однакові ?
Виктор

Відповіді:



45

Я не знаю, чому, але я просто перейменував свій вихідний файл COLARR.C на colarr.c і помилка зникла! напевно, вам це потрібно

sudo apt-get install g++

2
Зауважте, що .Cрозширення верхнього регістру є однією з низки умовних умов для джерела C ++ - .cppі .ccце дві інші. Верхні .Cрегістри погано взаємодіють з файловими системами, нечутливими до регістру (наприклад, Windows, macOS). Коли ви мали COLARR.C, система, ймовірно, дивилася на це як на вихідний файл C ++; як colarr.c, це вихідний файл C.
Джонатан Леффлер

23

Ця проблема може статися, якщо встановлені різні версії g ++ та gcc.

   g++ --version
   gcc --version

Якщо вони не дають результату, напевно встановлено кілька версій gcc. Перевірити це можна за допомогою:

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

Зазвичай / usr / bin / gcc буде сим-прив'язаним до / etc / alternatives / gcc, який знову буде пов'язаний із символом /usr/bin/gcc-4.6 або /usr/bin/gcc-4.8 (Якщо у вас є gcc-4.6, gcc-4.8 встановлено.)

Змінивши це посилання, ви можете змусити gcc та g ++ працювати в одній версії, і це може вирішити вашу проблему!


Це не вирішує проблему, я не знайшов способу змінити ці посилання.
Brana

Це спрацювало, і помилка зникає після того, як я змінив програмне посилання / etc / alternatives / gcc з / usr / bin / gcc72 на / usr / bin / gcc48 за допомогою ln -fs / usr / bin / gcc48 / etc / alternatives / gcc .
buxizhizhoum

7

Кожен компілятор має свій libexec / каталог. Зазвичай каталог libexec містить невеликі допоміжні програми, викликані іншими програмами. У цьому випадку gcc шукає власний компілятор 'cc1'. Ваша машина може містити різні версії gcc, і кожна версія повинна мати власний 'cc1'. Зазвичай ці компілятори розміщені на:


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

Аналогічний шлях для g ++. Вище помилка означає, що поточна версія gcc не може знайти власний компілятор 'cc1'. Зазвичай це вказує на проблему PATH.


У мене була та ж проблема з моїм середовищем PATH, коли я запустив, strace g++ [args]я виявив, що він намагався неправильну папку в шляху, а потім відмовився.
sirbrialliance

2

У мене виникло те саме питання, коли розгортався з "python"; Основна причина полягає в тому, що шлях пошуку є відносним, якщо ви не зателефонуєте g++як /usr/bin/g++, він не зможе визначити канонічні шляхи для виклику cc1plus.


0

У мене була така ж проблема з gcc "gnat1", і це було пов’язано з тим, що шлях був невірним. Gnat1 був у версії 4.6, але я виконував версію 4.8.1, яку я встановив. Як тимчасове рішення я скопіював gnat1 з версії 4.6 і вставив у папку 4.8.1.

Шлях до gcc на моєму комп’ютері: / usr / lib / gcc / i686-linux-gnu /

Ви можете знайти шлях за допомогою команди find:

find /usr -name "gnat1"

У вашому випадку ви шукаєте cc1plus:

find /usr -name "cc1plus"

Звичайно, це швидке рішення, і більш грунтовною відповіддю було б виправлення зламаного шляху.



0

У вашій установці GCC щось пішло не так . Спробуйте перевстановити його так:

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

В Ubuntu g++це пакет залежностей, який встановлює версію за замовчуванням g++для вашої версії ОС. Тож просто видалити та встановити пакет знову не буде працювати, оскільки він встановить версію за замовчуванням. Ось чому вам потрібно перевстановити.

Примітка. Ви можете замінити g++-5потрібну g++версію. Щоб знайти свою поточну g++версію, запустіть це:

g++ --version

0

У вас може виникнути ця проблема, якщо у вас є змінна середовища GCC_ROOT, що вказує на неправильне місце. Можливо, найпростішим виправленням може бути (у * nix like system):

unset GCC_ROOT

у більш складних випадках вам може знадобитися перенаправити його в потрібне місце

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.