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 です。
- gnuwin32のインストール
- MinGWのインストール
- 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><imgsrc="xxx.png"/><imgsrc="yyy.png"/></body></html>
画像が存在するかどうかは関係なく、並列にリクエストが発行される(上のhtmlだと画像のリクエスト)ような場合に落ちているようです。2つある画像の片方をコメントアウトすると、落ちなくなりました。
正しくコンパイルできていない?
並列のリクエストで落ちる状態では、MTとかWordPressも動作しないよな。http://github.com/mattn/tinytinyhttpd/tree/master には動作しているスクリーンショットがある。やはり、-lpthreadのオプションを弄ってるので、正しくコンパイルできていない可能性も高いですが、試してみた環境では、上のような状況です。mattnさん、なにかわかったら教えてくださいorz.
上記エラーですが、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を使えばなんとなくですが、出ないような気もしているのですが…