コンパイルエラー:「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
環境変数を出力して比較しようとしましたか?セーフモードをオンまたはオフにしていますか?
Vyktor 2012年

はい..私はPHPとシェルとの間のenv変数を比較した...しかし、それはどんな助けを持っていけない...と私のセーフモードはオフ..です
Zeyiファン

同じユーザーを使用しているか、Webサーバーからスクリプトを実行していますか?「-v」を追加します(詳細な出力になるはずです)。おそらく答えがあるでしょう。
Vyktor 2012年

わかりました。C++コードをコンパイルしphp xx.phphttpユーザーとして実行するためにテストしました。それらのすべてが成功です...との出力g++ -vのPHPコードでは、その中にシェルと似て..です
Zeyiファン

1
gcc -print-search-dirsこれはどう?出力は同じですか?
Vyktor 2012年

回答:



45

理由はわかりませんが、ソースファイルCOLARR.Cの名前をcolarr.cに変更しただけで、エラーが消えました!おそらくこれが必要です

sudo apt-get install g++

2
大文字のことに注意してください.C-エクステンションはC ++ソースの規則のうちの1つであり、.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を実行していました。一時的な解決策として、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では、これg++g++OSバージョンのデフォルトバージョンをインストールする依存パッケージです。したがって、パッケージを削除して再度インストールするだけでは機能しません。デフォルトのバージョンがインストールされるためです。そのため、再インストールする必要があります。

注:をg++-5目的のg++バージョンに置き換えることができます。現在のg++バージョンを確認するには、次のコマンドを実行します。

g++ --version

0

環境変数GCC_ROOTが間違った場所を指している場合にも、この問題が発生する可能性があります。おそらく最も単純な修正は(* nixのようなシステムで)可能性があります:

unset GCC_ROOT

より複雑なケースでは、適切な場所に再ポイントする必要があるかもしれません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.