编译错误:“ g ++:尝试执行'cc1plus'错误:execvp:没有这样的文件或目录”


95

当我使用popenin 编译C / C ++程序时,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变量...但它不具有任何帮助......我的安全模式是关闭..
则以风扇

您使用的是同一用户还是正在从Web服务器执行脚本?添加“ -v”(应该是详细输出),也许会有答案。
Vyktor 2012年

好的..我刚刚测试过编译C ++代码并php xx.phphttp用户身份运行。所有的人是成功......和输出g++ -v在PHP代码与它的壳相似..
则以风扇

1
gcc -print-search-dirs这个怎么样?输出是否相同
Vyktor 2012年

Answers:


120

您需要安装gcc-c++软件包。

yum install gcc-c++

27
对于高山来说,这是apk add g++
shadi

45

我不知道为什么,但是我只是将源文件COLARR.C重命名为colarr.c,错误消失了!可能你需要这个

sudo apt-get install g++

2
请注意,大写.C扩展名是C ++源代码的众多约定之一,.cpp并且.cc是另外两个约定。大写.C约定与不区分大小写的文件系统(例如Windows,macOS)交互不良。当您拥有时COLARR.C,系统可能会将其视为C ++源文件。as 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 ++在同一版本中运行,这可以解决您的问题!


这不能解决问题,我没有找到更改这些链接的方法。
布拉娜

它起作用了,并且我用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 2012年

2

使用“ python”进行分叉时,我遇到了同样的问题;主要原因是搜索路径是相对的,如果不调用g++as /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

在更复杂的情况下,您可能需要将其重新指向正确的位置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.