使用 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++ 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 gcc 和 g++ 分别编译带有 C 和 C++ 文件的项目?