Windowsでtthttpd(tinytinyhttpd)をコンパイル

お礼とは言っては何ですが(Windowsなんかイラネかもしれませんが)、smegheadさんが作っておられるC言語で書かれたBTS「starbug1」をWindowsにポーティングしてみました。

Big Sky :: tthttpd(tinytinyhttpd)でstarbug1が動いた。

最初にお礼を。mattnさんにStarbug1のWindowsポーティングパッチを頂きました。ありがとうございます。 既に取り込ませてもらいました。 Starbug1がWindowsのapacheで問題なく動作しています。

しかし、Windows上のtthttpdでは、動作していません。というかまず、tthttpdのコンパイルの方法が正しいかどうかも怪しいです。

Windowsでのコンパイル環境の構築

コンパイルと実行に使用したのは、Windows XP SP3 です。

  1. gnuwin32のインストール
  2. MinGWのインストール
  3. MSysのインストール

tthttpdのコンパイル

  • lpthreadで cannot find -lpthread というエラーが出た。

pthreadをインストールしようとしたが、インストールできずに悩んでいたが、ソースを見たところ、Windowsでは、pthread.hをincludeしていないようなので、Makefile.w32の-lpthreadを削除したところコンパイルは完了しました。(これがいいのか悪いのか。)

Starbug1を動作確認

トップページを表示しようとしたところ、エラーでtthttpdが異常終了します。エラーの内容は、下の2種類のどちらかになります。

コマンドプロンプト(標準エラー出力かな?)に以下のメッセージが表示される。
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Windowsのエラーダイアログが表示される。
---------------------------
tthttpd.exe - アプリケーション エラー
---------------------------
"0x003e6abb" の命令が "0x01e6a0c8" のメモリを参照しました。メモリが "written" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください
---------------------------
OK   キャンセル
---------------------------

再現するhtml

試していると、どうやらcgiには関係ない様子でした。

コンフィグのファイルの指定も何もせずに、tthttpd.exeをダブルクリックで起動して下のようなhtmlを表示する場合でも、上のエラーが再現しました。

<html>
<head> 
</head>
<body>
<h1>test</h1>
<img src="xxx.png" />
<img src="yyy.png" />
</body>
</html>

画像が存在するかどうかは関係なく、並列にリクエストが発行される(上のhtmlだと画像のリクエスト)ような場合に落ちているようです。2つある画像の片方をコメントアウトすると、落ちなくなりました。

正しくコンパイルできていない?

並列のリクエストで落ちる状態では、MTとかWordPressも動作しないよな。http://github.com/mattn/tinytinyhttpd/tree/master には動作しているスクリーンショットがある。やはり、-lpthreadのオプションを弄ってるので、正しくコンパイルできていない可能性も高いですが、試してみた環境では、上のような状況です。mattnさん、なにかわかったら教えてくださいorz.

1件のコメント

  • 上記エラーですが、msvcr70.dll/msvcr71.dllというDLLで発生します。これについてはMSからパッチが公開されてたかと思います。
    結構これでハマる事が多い様です。http://bit.ly/ue0lS

    mingw32からリンクされるどのモジュールがmsvcr70.dll/msvcr71.dllにリンクされているかまだ分かっていませんが、そのDLLをmsvcr70.dll/msvcr71.dllに依存しない様にビルドし直すか、前述のパッチを入れるかになります。
    なお、Microsoft Visual C++でコンパイルすると、上記のエラーが出ない事は確認出来ています。

    ちなみに、-lpthreadはミスです。苦笑
    mingw32様のpthreadを使えばなんとなくですが、出ないような気もしているのですが…

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください