编译错误:"g++: error trying to exec 'cc1plus': execvp: No such file or directory"

156

在使用php编译带有popen的C/C++程序时...我遇到了这个错误:

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

但是如果我在 shell 中运行 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
是的,我比较了PHP和Shell之间的环境变量...但是它没有任何帮助...而且我的安全模式已经关闭了。 - Zeyi Fan
你是使用相同的用户还是从Web服务器执行脚本?添加“-v”(应该是详细输出),也许会有答案。 - Vyktor
1
gcc -print-search-dirs 这个怎么样?输出结果 一样 吗? - Vyktor
gcc -v 的区别是 > COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-linux-gnu/4.6.2/lto-wrapper,而 gcc -print-search-dirs 的输出相同。 - Zeyi Fan
显示剩余4条评论
11个回答

199
你需要安装 gcc-c++ 包。
yum install gcc-c++

80
对于 Alpine 系统来说,这个命令是 apk add g++ - Shadi
34
对于Ubuntu来说,这意味着要执行apt install g++命令安装g++。 - bfontaine

98

我不知道为什么,但我刚刚将源文件COLARR.C重命名为colarr.c,错误消失了! 也许你需要这样做。

sudo apt-get install g++

3
请注意,大写的 .C 扩展名是 C++ 源文件的一种约定,.cpp.cc 是另外两种。但是,大写的 .C 扩展名与不区分大小写的文件系统(例如 Windows、macOS)不兼容。当您使用 COLARR.C 时,系统可能会将其视为 C++ 源文件;而使用 colarr.c 则是一个 C 源文件。 - Jonathan Leffler

35

如果安装了不同版本的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
1
这是我的情况。我安装了新版本的gcc并创建了gcc二进制文件的符号链接,但是忘记了同时创建g++二进制文件的符号链接。请确保gcc -vg++ -v显示相同的版本。 - Rahul Bharadwaj
刚刚发生了这样的情况,我需要为gcc和g++制作相同版本,gcc是在12中,而g++仅在11中。 - Abdelouahab

10

每个编译器都有自己的libexec/目录。通常,libexec目录包含其他程序调用的小型辅助程序。在这种情况下,gcc正在寻找其自己的'cc1'编译器。您的计算机可能包含不同版本的gcc,每个版本应该有自己的'cc1'。通常这些编译器位于:


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

对于g++,也有类似的路径。上述错误意味着当前使用的gcc版本无法找到自己的'cc1'编译器。这通常指向一个PATH问题。


当我运行 strace g++ [args] 时,我遇到了与我的 PATH 环境相同的问题。我发现它尝试了路径中错误的文件夹,然后放弃了。 - sirbrialliance

4
对于apk包,最简单的方法是: apk add build-base

3

在openSuSE上安装g++

zypper in gcc-c++

2

当我使用“python”进行分叉时,我遇到了同样的问题;主要原因是搜索路径是相对的,如果您不将g ++调用为/usr/bin/g ++,它将无法计算出调用cc1plus的规范路径。


1
如果你的环境变量GCC_ROOT指向了错误的位置,那么你可能也会遇到这个问题。可能最简单的解决方法是(在*nix类系统上):
unset GCC_ROOT

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

1

您的GCC安装出现了问题。尝试按照以下方式重新安装它:

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

在Ubuntu中,g++是一个依赖包,它会安装适用于您的操作系统版本的默认版本的g++。因此,仅仅移除并重新安装该软件包是不起作用的,因为它会安装默认版本。这就是为什么您需要重新安装的原因。
注意:您可以将g++-5替换为您想要的g++版本。要查找当前g++版本,请运行以下命令:
g++ --version

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"

当然,这是一个快速解决方案,更可靠的答案是修复损坏的路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接