読者です 読者をやめる 読者になる 読者になる

聞きかじりめも

主にC++やメディア処理技術などに関して気付いたことを書いていきます.ここが俺のメモ帳だ!

FlyCapture2 SDKがVS2015で動かなくなった件

生存報告も兼ねて.

もう半年以上放置していたのは,しゅーろんとかいうクソイベとDの新生活が思っていた以上に忙しかったためです.

PointGray社のFlyCapture2 SDKにバグがあったのでその報告と対策.

何が起こったのか

【以前】 Windows 8.1(64bit)環境で,VisualStudio2013で開発していたときには何も問題なくビルドができていた.

【今回】 同じ環境で,VisualStudio2015にアップグレードしたら以前のコードに大量のエラー. なんかFlyCapture2::Cameraとか重要なやつに赤い波線が…

クラス宣言の外側に無効な型指定子があります.

namespace"FlyCapture2"にメンバー"Camera"がありません.

ぶっちゃけありえな~い!

原因

FlyCapture2::Camera等の型指定子FLYCAPTURE2_APIの定義は FlyCapture2Platform.h内のマクロで決められているが,こいつがVS2015以降に仕事しなくなったのだ.

// 前略
#if defined(WIN32) || defined(WIN64)
// Windows 32-bit and 64-bit
// 中略
#elif defined(MAC_OSX)

// Mac OSX

#else
// Linux and all others
// 後略

元々,VisualStudioの定義済みマクロは_WIN32_WIN64など,_が前に付いているのが普通であり, 今までWIN32とかWIN64が使えていたほうが不思議だったらしい. FlyCapture2 SDKは,この謎のマクロに依存した書き方をしていたため,VS2015以降の仕様変更(?)で動かなくなったのだろう.

参考:

定義済みマクロ

visual studio - C++ MSVC14.0 での WIN32マクロについて - スタック・オーバーフロー

対策

FlyCapture2.hをインクルードする前にWIN32をdefineしてしまえばいい.たとえば次の様に.

#ifdef _WIN32
#define WIN32
#endif
#ifdef _WIN64
#define WIN64
#endif

#include <FlyCapture2.h>
#include <FlyCapture2GUI.h>

以上.

この件については公式サポートに問い合わせメールを出しておきました.