Попытка скомпилировать C-код с PHP - PullRequest
4 голосов
/ 11 августа 2010

У меня есть файл с именем gcc.exe, и у меня есть страница php ... Я хочу использовать:

gcc test.c

И, если есть какая-то ошибка компиляции, я хочу показать ее на странице php ... Но я не могу. Что происходит: если файл правильный, он создает файл .exe, но если это не так, ничего не происходит. Здесь я снова хочу показать все ошибки.

У кого-нибудь есть идея?

Edit [1]: Какой-то код:

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

Выход:

*Nothing*

Edit [2]: Я попытался поместить вывод gcc в текстовый файл: Таким образом (по подсказке):

gcc test.c > teste.txt

Теоретически все на экране идет в текстовый файл. Но это было безуспешно!



Редактировать [3]: квант: Я попробовал это, и ...

array(0) { } int(1)

Ничего ... Еще что-нибудь?

Ответы [ 4 ]

6 голосов
/ 11 августа 2010

gcc, скорее всего, выдаст сообщение об ошибке на stderr, которое, как кажется, exec не фиксирует в массиве $ results.Решения для этого, скорее всего, будут зависеть от платформы.Если вы работаете в Unix-подобной среде, можно было бы сделать что-то вроде gcc foo.c 2>&1, чтобы перенаправить stderr в stdout.Я понятия не имею, как можно достичь этого в Windows, или даже существуют аналогичные концепции.Возможно, кто-то еще может уточнить, если ваш вопрос зависит от платформы.

Это подтверждается тем фактом, что передача в файл тоже не работает.

3 голосов
/ 11 августа 2010

exec () ссылка

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

Попробуйте

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

var_dump($output);
var_dump($return);
0 голосов
/ 11 августа 2010

Мы используем систему на основе PHP, которая выполняет построение и фиксирует результаты и ошибки под окнами.Мы добились наибольших успехов, когда PHP-скрипт создал пакетный файл, содержащий все команды сборки, а затем exec -ing этот пакетный файл.Когда он создает пакетный файл, он перенаправляет стандартный вывод компилятора в один файл журнала, а стандартную ошибку - в другой (commandname >>log.txt 2>>err.txt).Поскольку ваши выходные данные разделены на два файла, также помогает скрипту генерировать строки, которые выводят описания происходящего (например, «Сборка библиотеки libsockets.dll»), чтобы вы могли лучше сопоставить два журнала.Иногда это даже помогает отобразить каждую команду перед ее выполнением.Обычно ваш процесс сборки останавливается при возникновении ошибки (по крайней мере, вероятно, должен ), поэтому содержимое журнала ошибок обычно совпадает с хвостовой частью нормального журнала.

0 голосов
/ 11 августа 2010

Используйте 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
...