编译错误:“g++:尝试执行 'cc1plus' 时出错:execvp:没有这样的文件或目录”
Posted
技术标签:
【中文标题】编译错误:“g++:尝试执行 \'cc1plus\' 时出错:execvp:没有这样的文件或目录”【英文标题】:Compile error: "g++: error trying to exec 'cc1plus': execvp: No such file or directory"编译错误:“g++:尝试执行 'cc1plus' 时出错:execvp:没有这样的文件或目录” 【发布时间】:2012-02-11 07:34:15 【问题描述】:当我在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;
?>
谢谢
【问题讨论】:
您是否尝试过打印环境变量并进行比较?您是否开启或关闭了安全模式? 是的..我比较了 php 和 shell 之间的环境变量......但它没有任何帮助......而且我的安全模式是关闭.. 您是在使用同一个用户还是从 Web 服务器执行脚本?加上“-v”(应该是详细输出),说不定会有答案。 ok.. 我刚刚测试编译 C++ 代码并以http
用户身份运行php xx.php
。所有这些都是成功的......并且g++ -v
在php代码中的输出与它在shell中的输出相似......
gcc -print-search-dirs
这个怎么样?输出是否相同?
【参考方案1】:
每个编译器都有自己的 libexec/ 目录。通常 libexec 目录包含由其他程序调用的小帮助程序。在这种情况下,gcc 正在寻找自己的 'cc1' 编译器。你的机器可能包含不同版本的 gcc,每个版本都应该有自己的 'cc1'。通常这些编译器位于:
/usr/local/libexec/gcc/<architecture>/<compiler>/<compiler_version>/cc1
g++ 的类似路径。上面的错误意味着当前使用的 gcc 版本无法找到它自己的 'cc1' 编译器。这通常表明存在 PATH 问题。
【讨论】:
当我运行strace g++ [args]
时,我的 PATH 环境遇到了同样的问题,我发现它尝试了路径中的错误文件夹然后放弃了。【参考方案2】:
我在 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"
当然,这是一个快速的解决方案,更可靠的答案是修复损坏的路径。
【讨论】:
【参考方案3】:你需要安装gcc-c++
包。
yum install gcc-c++
【讨论】:
对于 alpine,这是apk add g++
对于 Ubuntu,这是apt install g++
【参考方案4】:
我不知道为什么,但我只是将源文件 COLARR.C 重命名为 colarr.c 并且错误消失了! 可能你需要这个
sudo apt-get install g++
【讨论】:
请注意,大写的.C
扩展名是 C++ 源代码的众多约定之一——.cpp
和 .cc
是另外两个。大写的.C
约定与不区分大小写的文件系统(例如Windows、macOS)的交互很糟糕。当您拥有COLARR.C
时,系统可能将其视为 C++ 源文件;如colarr.c
,它是一个C源文件。【参考方案5】:
如果安装了不同版本的 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 将 /etc/alternatives/gcc 的软链接从 /usr/bin/gcc72 修改为 /usr/bin/gcc48 后,错误消失了/gcc48 /etc/alternatives/gcc. 这是我的情况。我安装了新版本的 gcc 并对 gcc 二进制文件进行了符号链接,但也忘记了对 g++ 二进制文件进行符号链接。只需确保gcc -v
和 g++ -v
显示相同的版本即可。【参考方案6】:
我在使用“python”分叉时遇到了同样的问题;主要原因是搜索路径是相对的,如果不将g++
称为/usr/bin/g++
,将无法计算出调用cc1plus
的规范路径。
【讨论】:
【参考方案7】:安装 g++ 在 openSuSE 上运行
zypper in gcc-c++
【讨论】:
【参考方案8】:您的GCC 安装出现问题。尝试像这样重新安装它:
sudo apt-get install --reinstall g++-5
在 Ubuntu 中,g++
是一个依赖包,它为您的操作系统版本安装默认版本的g++
。所以简单地删除并再次安装包是行不通的,因为它将安装默认版本。这就是您需要重新安装的原因。
注意:您可以将 g++-5
替换为您想要的 g++
版本。要查找您当前的g++
版本,请运行以下命令:
g++ --version
【讨论】:
【参考方案9】:如果您的环境变量 GCC_ROOT 指向错误的位置,您也可能会遇到此问题。可能最简单的修复可能是(在 *nix 之类的系统上):
unset GCC_ROOT
在更复杂的情况下,您可能需要将其重新指向正确的位置
【讨论】:
【参考方案10】:对于 apk,最简单的方法是:
apk add build-base
【讨论】:
以上是关于编译错误:“g++:尝试执行 'cc1plus' 时出错:execvp:没有这样的文件或目录”的主要内容,如果未能解决你的问题,请参考以下文章