为什么用<iostream>进行编译会导致Apache出现500错误?</iostream>

时间:2013-08-05 04:31:46

标签: c++ cgi

我正在使用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-1\n\n");
    printf("Hello printf\n\n");
    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-1\n\n");
    printf("Hello printf\n\n");
    return 0;
}

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

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

只有当我加入iostream时才会出现问题。

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

注意:我收录了“Content-Type:text / html; charset = ISO-8859-1 \ n \ n”

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

为什么 iostream 会在 cstdio 没有时导致此错误,如何解决?

1 个答案:

答案 0 :(得分:1)

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

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

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