!!!Pthreads-w32 2.8.0のバグ Windows上でPOSIXのpthreadsを実現するライブラリ、[POSIX Threads (pthreads) for Win32|http://sourceware.org/pthreads-win32/]の最新版、2.8.0(2009年12月現在)にはバグがある。これは[[MinGW+ffmpeg(5)pthread]]や[[MinGW+ffmpeg(A)pthreadは複雑]]に書いた''使用方法に注意が必要というものではなく''、最近のffmpeg等をビルドしようとする場合に、''コンパイルエラー''となるバグだ。 動作に関するバグでは無く、発現時には必ずわかるだけまだマシなバグではある。が、その解決方法に関してあまりよろしくない方法が流通しているようなので、ここに現状で適切と思われる方法をメモしておく。 !!バグの内容 ffmpeg等、''_POSIX_C_SOURCE''をdefineしているソフトウェアのコンパイル時に、以下のようなエラーが出る。 {{pre error: expected ')' before 'pid' }} TODO:実際にffmpegをビルド時のエラーに差し替えること。 これはpid_tが型として未定義なために発生しているエラーだ。 pthreads-w32はPOSIX互換のスレッド機能を実装するライブラリなので、当然、_POSIX_C_SOURCEの定義によりその内容が変化する。pid_tは本来sched.hで定義されるはずなのだが、対応が不十分なために未定義になってしまうことがある、というのがその原因だ。 pid_tを強制的に定義してしまえば、コンパイルは通るには通るし、ネット上ではそれが解決方法として多く紹介されている。しかし、より正しくはどう修正すべきなのだろうか。 検索範囲を英語圏に広げると、pthreads-win32のMLにそのものずばり、[Help with issues on trying to compile ffmpeg with pthreads support|http://www.sourceware.org/ml/pthreads-win32/2008/msg00046.html]というスレッドがある。 これに対する[回答|http://www.sourceware.org/ml/pthreads-win32/2008/msg00046.html]では、 {{pre #if defined(__MINGW32__) || defined(_UWIN) #if PTW32_LEVEL >= PTW32_LEVEL_MAX /* For pid_t */ # include /* Required by Unix 98 */ # include #endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ #else typedef int pid_t; #endif }} となっているところを {{pre #if defined(__MINGW32__) || defined(_UWIN) #if PTW32_LEVEL >= PTW32_LEVEL_MAX /* For pid_t */ # include /* Required by Unix 98 */ # include #else typedef int pid_t; #endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ #else typedef int pid_t; #endif }} のようにしろ、と言っている。これは''実用上''十分な修正ではあるようだが、もう少し踏み込もう。 この回答を書いたRoss Johnson氏は、[Ramiro Polla - _POSIX_C_SOURCE-related problems|http://sourceware.org/ml/pthreads-win32/2008/msg00050.html]にも[回答|http://sourceware.org/ml/pthreads-win32/2008/msg00051.html]を書いていて、こちらが本質的なポイントを突いている。_POSIX_C_SOURCE=200112の場合にはPTW32_LEVEL=3に設定されるべきところが、PTW32_LEVEL=1となってしまうのが根本的な原因だ。 そして[pthreads-win32のCVS|http://sourceware.org/cgi-bin/cvsweb.cgi/pthreads/?cvsroot=pthreads-win32#dirlist]には、既に仮の修正がコミットされているとのこと。内容はCVSを見てもらうとして、同様の潜在的問題点はpthread.hにもあるようなので、こちらも同時に修正すべきだ。 猫科研究所では、[[MinGW猫科研究所パック]]にpthreads-w32を含むTDM版のGCCを含めているため、猫研パックにはこの修正相当のdiff(patch)を添付している。そのパッチをここに単独で置いておく。 {{ref_size pthreads-w32-2-8-0-fixposix.diff}} (2009/12/09)