尝试用PHP编译C代码

时间:2010-08-11 15:35:44

标签: php gcc cmd compilation exec

我有一个名为gcc.exe的文件,我有一个php页面... 我想用:

gcc test.c

并且,如果有一些编译错误,我想在php页面上显示它... 但我不能。 会发生什么:如果文件正确,它会生成.exe文件, 但如果错了,什么都没发生。我想要的是再次显示所有错误。

有人有想法吗?

修改[1]: 一些代码:

<?php
exec("gcc teste.c",$results);
print_r($results)
?>

输出:

*Nothing*

修改[2]: 我尝试将gcc输出放在文本文件中: 这样(在提示符下):

gcc test.c > teste.txt

在屏幕上,屏幕上的所有内容都会转到文本文件。 但这是不合适的!



编辑[3]: quantumSoup: 我试过了,然后......

array(0) { } int(1)

没什么......还有什么?

4 个答案:

答案 0 :(得分:6)

gcc可能会在stderr上生成错误输出,它会显示exec未在$ results数组中捕获。对此的解决方案可能有点特定于平台。如果您在类似unix的环境中工作,则可以执行gcc foo.c 2>&1之类的操作将stderr重定向到stdout。我不知道如何在Windows上实现这一目标,或者甚至存在类似的概念。如果您的问题是特定于平台的,也许其他人可以详细说明。

这得到了以下事实的支持:文件的管道也不起作用。

答案 1 :(得分:3)

exec() reference

string exec ( string $command [, array &$output [, int &$return_var ]] )

尝试

exec('gcc test.c', $output, $return);

var_dump($output);
var_dump($return);

答案 2 :(得分:0)

使用proc_open捕获stderr:

<?php
$process = proc_open('gcc test.c',
    array(
        1 => array("pipe", "w"),  //stdout
        2 => array("pipe", "w")   // stderr
    ), $pipes);

echo stream_get_contents($pipes[2]);

给出了例如:

sh: gcc: command not found

答案 3 :(得分:0)

我们使用基于PHP的系统来执行构建并在Windows下捕获结果和错误。通过让PHP脚本创建包含所有构建命令的批处理文件,然后exec - 批处理文件,我们取得了最大的成功。在创建批处理文件时,它会将编译器的标准输出重定向到一个日志文件,将标准错误重定向到另一个(commandname >>log.txt 2>>err.txt)。由于您的输出是在两个文件之间拆分的,因此脚本生成的行会回显有关正在发生的事情的描述(例如“构建库libsockets.dll”),这样您就可以更好地匹配这两个日志。有时,它甚至可以帮助在执行之前回显每个命令。通常,您的构建过程将在遇到错误时停止(至少它可能),因此错误日志的内容通常与正常日志的尾端匹配。