2010年04月24日

OpenCV 2.1/SIMD SSE Visual Studio2005コンパイルエラー対策

画像処理ライブラリのOpenCV 2.1正式版がリリース
されましたが、Visual Studio 2005ではcxcoreが
ビルドエラーでコンパイルが通りません。

詳解OpenCV


cvinternal.h

で、SSE2〜SSE3の命令を有効化する為の定義がありますが、
標準でコンパイラのバージョンが新しければSIMD命令を
使うようになっています。

#if defined __SSE2__ || _MSC_VER >= 1300
#include "emmintrin.h"
#define CV_SSE 1
#define CV_SSE2 1
#if defined __SSE3__ || _MSC_VER >= 1400
#include "pmmintrin.h"
#define CV_SSE3 1
#endif
#else
#define CV_SSE 0
#define CV_SSE2 0
#define CV_SSE3 0
#endif

の定義がそれです。実行環境を限定できるなら良いですが、
SSEはともかくSSE2に対応していない少し古いPCでの
実行も考えると、実行時にエラーで落ちるなどの
問題が発生する事になりそうです。

というわけで

/*
#if defined __SSE2__ || _MSC_VER >= 1300
#include "emmintrin.h"
#define CV_SSE 1
#define CV_SSE2 1
#if defined __SSE3__ || _MSC_VER >= 1400
#include "pmmintrin.h"
#define CV_SSE3 1
#endif
#else
#define CV_SSE 0
#define CV_SSE2 0
#define CV_SSE3 0
#endif
*/
#include "emmintrin.h"
#define CV_SSE 1
#define CV_SSE2 0
#define CV_SSE3 0

としておきました。これでVisual Studio 2005でも
OpenCV 2.1のビルドが出来ました。
上記では、SSE命令だけは有効にしています。
流石にSSEは今時使えるでしょ。
posted by ぽっぽファクトリー at 00:00 | Comment(2) | TrackBack(0) | ソフトウェア開発
この記事へのコメント
はじめまして.自分も同じ問題に困ってました.

#if defined __SSE3__ || _MSC_VER >= 1400
は個人的に_MSC_VER >= 1500(VS2008)な気がしてます.

あと,その変更だけだとintrin.hにバグがあるみたいでコンパイルエラーが出てしまうのでintrin.hに変更が必要です(あまりオススメできませんが。。。).http://bit.ly/dvtTU6
Posted by dandelion at 2010年04月26日 23:11
はじめまして。おっしゃるように

MSC_VER >= 1500(VS2008)

の間違いだと思います。VS2008 Express Edition
ではビルド通りますし :-)

SSE2を活かしたい場合、ご紹介いただいた
手段が有効そうですね。
当方、SSE2が乗ってない古いCPUでも
実行予定なので調べてませんでした。

ありがとうございます!!
Posted by ぽっぽさん at 2010年04月26日 23:32
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/37287512
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック