Ошибка компиляции: «g ++: ошибка при попытке выполнить exec 'cc1plus': execvp: нет такого файла или каталога»

99

Когда я компилирую программу 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;
?>

Благодарность

Zeyi Fan
источник
2
Вы пробовали распечатать переменные env и сравнить их? У вас включен или выключен безопасный режим?
Vyktor
да .. Я сравнил переменные env между php и оболочкой ... но тут ничего не поделаешь ... и мой безопасный режим выключен ..
Zeyi Fan
Вы используете того же пользователя или выполняете скрипт с веб-сервера? Добавьте «-v» (должен быть подробный вывод), может быть, будет ответ.
Vyktor
хорошо .. Я только что протестировал компиляцию кода C ++ и запуск php xx.phpот имени httpпользователя. все они g++ -v
успешны
1
gcc -print-search-dirsкак насчет этого? Выходы такие же ?
Vyktor

Ответы:

127

Вам необходимо установить gcc-c++пакет.

yum install gcc-c++
hahakubile
источник
29
для alpine это былоapk add g++
shadi
50

Не знаю почему, но я просто переименовал свой исходный файл 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 ++ работать в одной версии, и это может решить вашу проблему!

Pulkitag
источник
Проблему это не решает, возможности поменять эти ссылки не нашел.
Брана
Это сработало, и ошибка исчезла после того, как я изменил программную ссылку / 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++as /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"

Конечно, это быстрое решение, и более надежным ответом будет исправление сломанного пути.

rtrigoso
источник
0

Установите g ++ при запуске openSuSE

zypper in gcc-c++
Дэвид Хамнер
источник
0

Что-то пошло не так с вашей установкой GCC . Попробуйте переустановить его так:

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

В Ubuntu g++это пакет зависимостей, который устанавливает версию по умолчанию g++для вашей версии ОС. Поэтому простое удаление и повторная установка пакета не сработает, потому что будет установлена ​​версия по умолчанию. Вот почему нужно переустановить.

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

g++ --version
tsveti_iko
источник
0

У вас также может возникнуть эта проблема, если у вас есть переменная среды GCC_ROOT, указывающая на неправильное местоположение. Вероятно, самое простое исправление может быть (в системе типа * nix):

unset GCC_ROOT

в более сложных случаях вам может потребоваться перенаправить его в нужное место

Слава
источник