为什么使用<iostream>在Apache上导致500错误

Why does compiling with <iostream> cause a 500 error on Apache?

本文关键字:错误 Apache gt lt iostream 为什么      更新时间:2023-10-16

我正在使用gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)在C++中尝试cgi编程,当我试图在我的商业apache服务器上运行它时,我遇到了一个奇怪的错误。

Apache将在编译后运行以下内容:

#include <cstdio>
// no <iostream>
int main(int c, char **argv)
{
    printf("Content-Type: text/html; charset=ISO-8859-1nn");
    printf("Hello printfnn");
    return 0;
}

但是,如果iostream包含,服务器会返回500错误

#include <cstdio>
#include <iostream> //this will cause a 500 error
int main(int c, char **argv)
{
    printf("Content-Type: text/html; charset=ISO-8859-1nn");
    printf("Hello printfnn");
    return 0;
}

如果我用iostream编译第二个程序,该程序将从命令行完美运行,但如果我上传代码,apache将开始返回500个错误。

为了完整起见,我只使用cstio在C和Free Pascal以及C++中编译了类似的程序。没有问题。。。

只有当我包含iostream时,问题才会出现。

注意:我没有忘记更改权限

注意:我包含了"内容类型:text.html;charset=ISO-8859-1\n\n"

这就像我的服务器不接受用iostream编译的东西一样。

为什么iostream会导致此错误,而cstio没有,我该如何修复?

当本地计算机上的C++编译器版本与服务器上的版本不匹配时,可能会遇到此问题。很可能,#include <iostream>会触发编译器从libc++引入代码,而忽略它也会忽略libc++依赖关系。

为了避免这个问题,您可以尝试使用-static进行静态链接。这样做的优点是从本地副本中提取所有相关的代码,但确实会导致更大的可执行文件和更大的内存占用。

或者,您可以使用工具ldd调查所需的共享库版本,并确保在服务器计算机上安装适当的版本。