我正在使用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 没有时导致此错误,如何解决?
答案 0 :(得分:1)
当本地计算机上的C ++编译器版本与服务器上的版本不匹配时,您可能会遇到此问题。很可能#include <iostream>
会触发编译器从libc++
引入代码,而将其遗漏也会遗漏libc++
依赖项。
要避免此问题,您可以尝试使用-static
进行静态链接。这样做的好处是可以从本地副本中提取所有相关代码,但确实会产生更大的可执行文件和更大的内存占用。
或者,您可以使用工具ldd
调查所需的共享库版本,并确保在服务器计算机上安装适当的版本。