0

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;
}

その 2 番目のプログラムを iostream でコンパイルすると、プログラムはコマンド ラインから完全に実行されますが、コードをアップロードすると、Apache が 500 エラーを返し始めます。

完全を期すために、cstdio だけを使用して、C と Free Pascal の両方、および C++ で同様のプログラムをコンパイルしました。問題はありません...

問題は、iostream を含めた場合にのみ発生します。

注: パーミッションを変更することを忘れていませんでした。

注: 「Content-Type: text/html; charset=ISO-8859-1\n\n」を含めました

私のサーバーは、iostream でコンパイルされたものを受け入れないようです。

cstdioでは発生しないのにiostreamでこのエラーが発生するのはなぜですか? また、どのように修正すればよいですか?

4

1 に答える 1

1

この問題は、ローカル マシンの C++ コンパイラのバージョンがサーバーのバージョンと一致しない場合に発生する可能性があります。おそらく、#include <iostream>はコンパイラに からコードを取り込むようにトリガーしますが、libc++それを除外すると、libc++依存関係も除外されます。

この問題を回避するには、 との静的リンクを試すことができます-static。これには、関連するすべてのコードをローカル コピーから取得できるという利点がありますが、実行可能ファイルがはるかに大きくなり、メモリ フットプリントがやや大きくなります。

または、ツールを使用して必要な共有ライブラリのバージョンを調査し、ldd適切なバージョンがサーバー マシンにインストールされていることを確認することもできます。

于 2013-08-05T13:46:40.447 に答える