컴파일 오류 :“g ++ : 'cc1plus'를 실행하는 동안 오류 발생 : execvp : 해당 파일 또는 디렉토리가 없습니다.”


95

popenin php...으로 C / C ++ 프로그램을 컴파일 할 때이 오류가 발생했습니다.

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

하지만 쉘에서 PHP 코드를 실행하면 잘 작동합니다 ..

아치 리눅스에서 ..

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
환경 변수를 인쇄하고 비교해 보셨습니까? 안전 모드가 켜져 있거나 꺼져 있습니까?
Vyktor

그래 .. 내가 PHP와 쉘 사이의 ENV 변수를 비교 ...하지만 어떤 도움을 가지고 있겠지 ... 내 안전 모드는 .. 꺼짐
Zeyi 팬

동일한 사용자를 사용하고 있거나 웹 서버에서 스크립트를 실행하고 있습니까? "-v"(상세한 출력이어야 함)를 추가하면 답변이있을 수 있습니다.
Vyktor

좋아 .. 방금 C ++ 코드를 컴파일 php xx.php하고 http사용자로 실행하도록 테스트했습니다 . 그들 모두는 성공 ... 그리고 출력 g++ -vPHP 코드는 껍질과 유사하다 ..
Zeyi 팬

1
gcc -print-search-dirs이건 어때요? 출력 이 동일 합니까?
Vyktor

답변:


120

gcc-c++패키지 를 설치해야 합니다.

yum install gcc-c++

27
고산의 경우,이이었다apk add g++
샤디

45

이유는 모르겠지만 소스 파일 COLARR.C를 colarr.c로 이름을 바꾸고 오류가 사라졌습니다! 아마도이게 필요할거야

sudo apt-get install g++

2
대문자주의 .C확장은 C ++ 소스에 대한 규칙의 숫자 중 하나입니다 - .cpp그리고 .cc다른 두 사람이다. 대문자 .C규칙은 대소 문자를 구분하지 않는 파일 시스템 (예 : Windows, macOS)과 잘못 상호 작용합니다. 를 가지고있을 때 COLARR.C시스템은 아마도 그것을 C ++ 소스 파일로보고있을 것입니다. 로 colarr.c, C 소스 파일입니다.
Jonathan Leffler

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

작동했고 ln -fs / usr / bin / gcc48 / etc / alternatives / gcc를 사용하여 / etc / alternatives / gcc의 소프트 링크를 / usr / bin / gcc72에서 / usr / bin / gcc48로 수정하면 오류가 사라집니다. .
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 버전을 실행 중이었습니다. 임시 해결책으로 4.6에서 gnat1을 복사하여 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에서는 OS 버전 g++g++대한 기본 버전을 설치하는 종속성 패키지입니다 . 따라서 단순히 패키지를 제거하고 다시 설치하는 것은 작동하지 않으며 기본 버전을 설치하기 때문입니다. 그래서 다시 설치해야합니다.

참고 :을 g++-5원하는 g++버전으로 바꿀 수 있습니다 . 현재 g++버전 을 찾으려면 다음을 실행하십시오.

g++ --version

0

잘못된 위치를 가리키는 환경 변수 GCC_ROOT가있는 경우에도이 문제가 발생할 수 있습니다. 아마도 가장 간단한 수정은 다음과 같습니다 (* nix 같은 시스템에서).

unset GCC_ROOT

더 복잡한 경우에는 적절한 위치로 다시 지정해야 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.