从PHP编译C,exec错误试图执行'cc1'

时间:2015-10-23 01:40:23

标签: php c gcc exec shell-exec

大家好我正在尝试使用exec和Laravel Framework从PHP编译一个C程序,但我不认为这是问题,因为我可以从终端编译和执行C程序而没有问题,如果你知道在Laravel 5中的修补程序所以问题来自PHP但是我找不到错误我认为问题是从GCC的不同版本开始,但为什么让我从终端编译。

我从PHP那里得到这个错误。如果我从终端编译它可以工作,但不是从PHP。

    $path = public_path("testing/cosas.out");
    exec("gcc testing/pruebaC.c -o testing/from.out 2>&1",$output,$status);
    dd($output,$status); //is like var_dump

我得到了!!

  

gcc:尝试执行'cc1'时出错:execvp:没有这样的文件或目录“

我检查了权限,事实上我在绝望的XD中做了chmod 777 此外,我尝试重新安装一切,但它不起作用。 我很沮丧,我希望你能帮助我。

对不起我的英语,如果我犯了语法错误,谢谢我等待你的帮助:D

2 个答案:

答案 0 :(得分:4)

问题是,通过浏览器调用的应用程序通过正在处理Apache实例的用户来运行。如果这不是根(或其他特权用户),则它可能没有访问权限。此外,这将可能指示应用程序尝试从哪个目录执行。

当您从CLI执行时,用户是拥有终端实例的任何人(当然,除非su'd)。

答案 1 :(得分:1)

这是如何完成此工作的最小示例:

首先,创建一个新目录并cd。在该目录中,创建具有以下内容的index.php:

<?php
exec("gcc /var/www/html/test.c -o /tmp/a.out 2>&1",$compile_output,$compile_status);
var_dump($compile_output);
var_dump($compile_status);

exec("/tmp/a.out 2>&1",$run_output,$run_status);
var_dump($run_output);
var_dump($run_status);
?>

并使用以下内容创建test.c:

#include <stdio.h>
int main(void) {
        puts("Hello from C compiled by PHP!");
        return 0;
}

然后执行docker run -p 8080:80 -v /whatever/directory/you/created:/var/www/html php:apache。最后,转到http://localhost:8080,PHP脚本将编译并运行该C程序。

如果这在Docker中有效,但在“真实”环境中无效,那么您的环境设置不正确。特别是,请检查PATH以确保您使用的是自己想使用的gcc,并检查gcc -print-search-dirs的输出并确保cc1确实可以在其查找的位置找到。< / p>

如果它可以在终端上运行,而不能在PHP上运行,则将调试命令放入PHP脚本中,直到找到破坏它的区别。

如果您完全缺少cc1,请执行sudo apt --reinstall install build-essential,或者执行任何等效的操作来重新安装gcc及其对发行版的依赖。