目的
動かない時のチェックリスト
Unityはプラグイン更新の時に再起動が必要
PluginのコピーミスDebug/Releaseの間違い
OpenCVをつかうとうまくいかない
BUILD_WITH_STATIC_CRT
LINUXでのshared/static LIB の違い
「BUILD_SHARED_LIBS」のチェックを外し、「BUILD_WITH_STATIC_CRT」のチェックが入っていることを確認する。
依存関係を調べる
Dependency Walkerで実行ファイルの依存ファイルを調べる
depends.exe
LNK2038
「エラー LNK2038 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MD_DynamicRelease の値 'dllmain.obj' と一致しません。 Dll2 1 D:\GitUnity\toioUnity\0130\Dll2\Dll2\opencv_core3410.lib(stl.obj)
」
[C++][コード生成]の設定が異なるので発生する。
MD MT
/MD
アプリケーションでランタイム ライブラリのマルチスレッド対応および DLL 対応バージョンが使用されます。 _MT および _DLL を定義し、コンパイラにライブラリ名 MSVCRT.lib を .obj ファイルに挿入させます。
このオプションを使用してコンパイルされたアプリケーションは、MSVCRT.lib に静的にリンクされます。 このライブラリには、リンカーが外部参照を解決できるようにするコード レイヤーが用意されています。 実際の作業コードは、MSVCRversionnumberに含まれています。DLL。実行時に、MSVCRT.DLL にリンクされているアプリケーションに対して使用可能である必要があります。
/MT
アプリケーションで、マルチスレッド バージョンの静的なランタイム ライブラリが使用されます。 _MT を定義します。また、コンパイラにライブラリ名 LIBCMT.lib を .obj ファイルに挿入させるため、リンカーは LIBCMT.lib を使って外部シンボルを解決します。
問題
OpenCVをC++NativePlugin化して、Unityから使う。
凹みによると、OpenCVを/MTオプションつけてビルドするとよい。VCで[C++][コード生成]-[ランタイムライブラリ]項目/MTでうまくいくとのこと。
⇓
リンクエラーでます。
追加LIBあるので記述しておく
#pragma comment(lib,"ippiw.lib" ) // *
#pragma comment(lib,"ittnotify.lib" ) // *
#pragma comment(lib,"libjpeg-turbo" CV_EXT_STR)//JPGは名称変更?
備考)OpenCVビルドはそのまま。DLL作成プロジェクトのみ/MTしたバージョンはダメ(確認した)
作成したプロジェクト
Release版のみ設定
DLL : DLLテストのためC++/exeから呼び出して確認しています。
参考⇓
[[Unity]OpenCVSharpでArUcoを用いてARマーカ検出を行う](
テクスチャデータからOpenCV::Matを作る。
int type = CV_8UC4;// byte* 4
int h = 256;
int w = 256;
Mat matImage( h, w, type ); // rowl, int cols, int type );
for ( int y = 0; y < h; y++ ) {
for ( int x = 0; x < w; x++ ) {
uchar* texptr = matImage.ptr( y,x );// y,x
int index = 0;// ((y * h) + x);
if ( y % 8 == 0 ){
texptr[index+0] = 0xff;// 青
texptr[index+1] = 0x0;
texptr[index+2] = 0x0;
texptr[index+3] = 0xff;
}
else{
texptr[index + 0] = 0x0;
texptr[index + 1] = 0x0;
texptr[index + 2] = 0xff; // RED
texptr[index + 3] = 0xff;
}
}
}