LoginSignup
0
0

More than 3 years have passed since last update.

Unityプラグイン/C++ .. その2

Last updated at Posted at 2020-06-12

目的

動かない時のチェックリスト

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++][コード生成]の設定が異なるので発生する。

新規作成したプロジェクト
image.png

OpenCVの設定
image.png

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マーカ検出を行う](

https://kobazlab.tech/2019/02/07/opencvsharp%E3%81%A7aruco%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/)

テクスチャデータから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;
            }
        }
    }

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0