ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

OpenCVとBoost.Asioのインクルード順?

なにがあった

 自分でも何言ってるかわからないけど、opencv/cv.hとboost/asio.hppのインクルード順でwindows.hがすでに定義されてます的なコンパイルエラーが出た。

どういうこと?

 winsock.hとwindows.hはインクルードする順番によってはエラーを吐いてしまうという問題があります。つまり

#include <winsock.h>
#include <windows.h>

である必要があるわけです。
 で、boost.asioをwindows上で使用すると、内部的にはwinsockを使うことになるのですが、もし先にwindows.hがインクルードされていればboost.asioのヘッダでコンパイルエラーを出力してくれるようです。
 で、今回のケースではこのboost.asioの予防線に引っかかった訳です。

//NG
#include <opencv/cv.h>
#include <boost/asio.hpp>
//OK
#include <boost/asio.hpp>
#include <opencv/cv.h>

 OKな方の順番でインクルードするだけのヘッダを用意して、それを使ってasioとcvをインクルードするようにするとか、プリコンパイルヘッダをつかってそこで順番固定するとか、対策としてはそんなところでしょうか。

ということで

 windows上でOpenCV使うと中でこっそりwindows.hをインクルードしているみたいなのでwinsock.hを内包するようなライブラリと併用する時は気をつけましょう。
 もっと限定的に言うと、OpenCVとBoost.Asioをwindows上で併用する場合は気をつけましょう。