C++と色々

主にC++やプログラムに関する記事を投稿します。

MinGWでboostをビルドするとコンパイルエラーになる

MinGWgccでboostを使いたかったので、こちらのサイトを参考に

bootstrap.bat gcc

を実行しました。すると

Building Boost.Build engine
builtins.c: In function 'builtin_readlink':
builtins.c:1879:39: error: 'FSCTL_GET_REPARSE_POINT' undeclared (first use in th
is function)
     int okay = DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, &buf, s
izeof(buf), &n, NULL);
                                       ^
builtins.c:1879:39: note: each undeclared identifier is reported only once for e
ach function it appears in

Failed to build Boost.Build engine.
Please consult bootstrap.log for furter diagnostics.

You can try to obtain a prebuilt binary from

   http://sf.net/project/showfiles.php?group_id=7586&package_id=72941

Also, you can file an issue at http://svn.boost.org
Please attach bootstrap.log in that case.

と、FSCTL_GET_REPARSE_POINTが宣言されていないというコンパイルエラーになりました。

ググったところ、既にBoostにバグ報告されているようで、解決方法も載っていました。 https://svn.boost.org/trac/boost/ticket/9301

FSCTL_GET_REPARSE_POINTはwinioctl.hに定義されていますが、builtins.cにこのヘッダがインクルードされていないのが原因のようです。このファイルにはwindows.hがインクルードされており、windows.h内部でwinioctl.hをインクルードしているだろうと期待していたのがバグの原因ではないだろうかと、このバグ報告者は仰っています(多分)。

解決方法は、boostのディレクトリ/tools/build/v2/engine/builtins.cの33行目の

#ifdef OS_NT
#include <Windows.h>
#endif

#ifdef OS_NT
#include <winioctl.h>
#endif

にすれば大丈夫です。ちなみにこのバグはMSVCでビルドした時はおきません。MSVCのWindows.hでは内部でwinioctl.hをインクルードしているからです(MinGWのWindows.hはそうではない)。