booleanのサイズ

手軽に画像を生成するライブラリとして gd というものがある。 今日はそれをビルドしていて引掛った。 ビルドは通るのだが、実行時にエラーが出力されるのだ。

gd-jpeg: JPEG library reports unrecoverable error: JPEG parameter struct mismatch: library thinks size is 376, caller expects 360

gd が jpeg を処理するために libjpeg を下請けとして使っているわけだが、gd 側と libjpeg 側で構造体のサイズが違うということだ。
ソースコードを見ると、 jpeg_CreateCompress 関数に渡された jpeg_compress_struct 型の構造体のサイズチェックでエラーになっていることがわかる。 同じヘッダを見ているはずなのにこれはどういうことなのか。
結論を言うと、 libjpeg のヘッダである jpeglib.h よりも先行して読まれているヘッダでそれぞれ異なる定義をされていたのだ。
libjpeg 側では jmorecfg.h の定義 :

typedef int boolean;

gd 側では rpcndr.h の定義 :

typedef unsigned char boolean;

が適用されていた。
libjpegのチェックの仕掛けは面白いと思ったが、実行時にそんなチェックを入れるくらいなら他とかぶらないような名前にしとけよと思った次第。
Document ID: 8d227102b59d126e4e48e783bfc312f2