使用 PHP 编译 C++ 文件

Posted

技术标签:

【中文标题】使用 PHP 编译 C++ 文件【英文标题】:Compile C++ file Using PHP 【发布时间】:2012-01-05 23:48:39 【问题描述】:

我在 Windows 机器上使用 php。我也使用 Dev C++。我可以使用以下命令在 CMD 上完美编译 .cpp 文件:

g++ hello.cpp -O3 -o hello.exe

现在我要做的是使用 php system() 函数运行相同的命令,所以它看起来像这样:

system("g++ c:\wamp\www\grader\hello.cpp -O3 -o C:\wamp\www\grader\hello.exe");

但它不会编译。我迷路了,请告诉我我错过了什么?

我也查看了这个问题,这正是我所需要的,但我在那里找不到适合我的案例的有用解决方案:

Php script to compile c++ file and run the executable file with input file

【问题讨论】:

您确定g++ 已安装并在您的Windows 服务器上的PATH 中可见吗? 另外,你确定运行PHP的账号对c:\wamp\www\grader目录有修改权限吗? 【参考方案1】:

感谢大家。我尝试运行上面帖子中给出的代码,它就像一个魅力。

我使用浏览器运行了以下代码

$var =  exec("g++ C:/wamp/www/cpp/hello.cpp -O3 -o C:/wamp/www/cpp/hello.exe");
echo $var;

exe 文件已创建。当我运行 exe 文件时,我能够看到结果,但问题是当我在浏览器中运行上述代码时,结果未显示在网页上。我向所有用户授予了完全访问权限,但仍然没有在网页上显示结果。

我真的需要这方面的帮助,因为我正在做一个模拟退火项目,我想从编译的 c++ 程序中获取结果并将其显示在带有一些 jquery highcharts 的网页中。

再次感谢大家,它帮助了我很多,我也学到了很多东西。

【讨论】:

【参考方案2】:

使用 PHP exec 命令。

echo exec('g++ hello.cpp -O3 -o hello.exe');

应该可以。

PHP 中有一系列不同的 exec 和系统命令,请参见此处:

http://www.php.net/manual/en/ref.exec.php

如果你想把输出变成一个变量,那么使用:

$variable = exec('g++ hello.cpp -O3 -o hello.exe');

如果这不起作用,请确保 g++ 在您的路径中可用,并且您登录时具有足够的权限以允许它执行。

您可能还会发现它失败了,因为 PHP 本质上是由您的 Web 服务器执行的(除非您也在 cmd 提示符下运行 PHP),并且 Web 服务器用户 ID 可能没有对 G++ 正在尝试的文件夹的写入权限创建输出文件。

暂时授予对输出文件夹的“所有人”的写入权限将验证是否是这种情况。

【讨论】:

感谢您的回复,我会尝试制定您的方法。由于我是 windows 命令行的新手(我来自 linux 背景),我对 windows 约定不满意。我曾经在 linux 上运行 shell_exec(),它运行良好。 PHP 手册页将极大地帮助您,因为它将解释所有差异。但是,我很确定,您的根本问题将与权限相关。让我知道你是怎么办的。 :-) 实际上不是权限,问题在于 g++.exe 的完整路径。由于我的 PATH 中有 g++,我认为我不需要编写完整路径。显然我需要:) 是的,我在回答后注意到了上面的更新。 :-) 路径的工作方式与 *nix 中的工作方式略有不同,它也让我多次感到困惑。不过,我仍然会注意未来参考的权限,尤其是如果您在 Windows IIS Web 服务器下运行 PHP。【参考方案3】:

两件事:

    您正在使用双引号,并且没有转义路径中的 \。 您没有使用 g++ 的完整路径。

第一个很重要,因为 \ 后跟的东西在这样的字符串中具有特殊含义(您可能知道 \n 是换行符),第二个是相关的,因为 PHP 环境可能具有不同的搜索路径。

一个解决方案可能是

system("c:\\path\\to\\g++ c:\\wamp\\www\\grader\\hello.cpp -O3 -o C:\\wamp\\www\\grader\\hello.exe");

或者你可以使用单引号,而不是双引号,它们使用不同的、不那么严格的转义规则

system('c:\path\to\g++ c:\wamp\www\grader\hello.cpp -O3 -o C:\wamp\www\grader\hello.exe');

或者用/代替\,windows也支持。

system("c:/path/to/g++ c:/wamp/www/grader/hello.cpp -O3 -o C:/wamp/www/grader/hello.exe");

您所做的是您的选择,而许多人可能认为第一个丑陋,而最后一个在 Windows 上是不好的风格;-)

【讨论】:

谢谢,我使用了第一种方法,它成功了!由于我为 g++ 编写了 PATH 规则,我认为我不需要 g++ 的完整路径。

以上是关于使用 PHP 编译 C++ 文件的主要内容,如果未能解决你的问题,请参考以下文章

centos下怎么搭建c++的开发环境

使用 gcc 和 g++ 分别编译带有 C 和 C++ 文件的项目?

使用vs2019如何只编译一个c++文件

在 GCC 中编译 C++ 文件时出错

指示 Automake 对 *.S 文件使用 C++ 编译器?

编译的 C++ 可执行文件很大吗?