【问题标题】:Trying compile a C Code with PHP尝试用 PHP 编译 C 代码
【发布时间】:2010-08-11 15:35:44
【问题描述】:

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

gcc test.c

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

有人有想法吗?

编辑[1]: 一些代码:

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

输出:

*Nothing*

编辑[2]: 我尝试将 gcc 输出放在文本文件中: 这种方式(提示):

gcc test.c &gt; teste.txt

理论上,屏幕上的所有内容都转到文本文件。 但这并不成功!



编辑[3]:quantumSoup: 我试了一下,结果……

array(0) { } int(1)

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

【问题讨论】:

  • 可以使用.bat 文件的解决方案吗?
  • 当我尝试执行的程序/命令没有执行权限时(在 UNIX 系统中几乎总是来自 Apache 的 nobody),我会遇到这种情况。我认为在不更改您可能无权访问的服务器配置的情况下没有解决方法

标签: php gcc cmd compilation exec


【解决方案1】:

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

通过管道传输到文件也不起作用这一事实支持了这一点。

【讨论】:

  • 嗯,我在 Windows 上运行(嘘... rs)。但是暂时...我想稳定它以在 Windows 和 Unix 上运行!
  • 尝试 proc_open() 并设置第三个 descriptiorspec/pipe 以获得 stderr 输出。
【解决方案2】:

exec() reference

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

试试

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

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

【讨论】:

  • 可能还想捕获返回变量。如果 gcc 没有输出任何内容,捕获成功退出代码会很有用。
【解决方案3】:

使用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:找不到命令

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 2022-10-02
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2016-11-05
      • 2015-11-03
      相关资源
      最近更新 更多