

10年以上前に作成されたmatlabのscriptを動かすことを試みています。  
versionの違いやfunctionの有無などで、いくつか問題はありましたが、何とか解決できたと思っています。しかし、最後まで解決できない問題があります。

matlab scriptから*cpp/*hで書かれたファイルのfunctionを呼び込むことができずに困っています。自分の理解では、matlab
scriptからcppファイル(例えばAviReadMex.cpp)を呼ぶためには、mexというfunctionを使う必要があると思います。

そこで、

[code]

    mex AviReadMex.cpp
    
[/code]

を行ったところ、  
以下のようなエラーが出てきました。

[code]

    Building with 'MinGW64 Compiler (C++)'.
    Error using mex
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0xeb): undefined reference to
    `CVideo::CVideo()'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0xff): undefined reference to
    `CVideo::OpenVideo(char const*)'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x10c): undefined reference to
    `CVideo::GetCodec() const'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x133): undefined reference to
    `CVideo::CloseVideo()'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x1a5): undefined reference to
    `CVideo::GetHeight() const'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x1b4): undefined reference to
    `CVideo::GetWidth() const'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x21b): undefined reference to
    `CVideo::GetDataImage(unsigned char*, int) const'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x242): undefined reference to
    `CVideo::CloseVideo()'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x24b): undefined reference to
    `CVideo::~CVideo()'
    C:\Users\AKIHIR~1\AppData\Local\Temp\mex_156313621567061_1472\AviReadMex.obj:AviReadMex.cpp:(.text+0x259): undefined reference to
    `CVideo::~CVideo()'
    collect2.exe: error: ld returned 1 exit status
    
[/code]

AviReaderMex.cppには

[code]

    CVideo AviVideo;
    
[/code]

という行がありますので、ここが原因だと思いっています。

AviReaderMex.cppのlibraryを読みこむセクションには、

[code]

    #include <mex.h>
    #include "Video.h"
    #define NUMBER_OF_FIELDS 2
    
[/code]

です。  
AviReaderMed.cppと同じfolderの中に、Video.cppとVideo.hもあります。

ちなみに、

[code]

    mex Video.cpp
    
[/code]

とやりますと、AviReaderMex.cpp内のfunctionが足りないとエラーが出ます。

一つ疑問に思うところは、そのfolderは"C:\Users\AKIHIR~1\AppData\Local\Temp"とは別のところに存在しているのに、なぜこのfolderが読み込まれているのかが理解できません。

どなたかエラーの原因の解決方法をお知りの方がおりましたら、ご教授をお願いします。

使用環境は、  
OS: Windows10  
Matlab version: R2017b  
です。

よろしくお願いいたします。


CC BY-SA 3.0
2017-11-17T13:46:38.303
39658
2019-05-24T01:01:55.247
11048
question
c++ matlab
matlabでmexを使った時のエラー


MATLAB は直接 C/C++ の関数を呼び出せません。そこで、利用したい C++ の関数と MATLAB
の間に入って、データフォーマットの変換などをする、MATLAB の規約に沿ったインターフェース関数を C/C++
で作る必要があります。`mex`コマンドは、利用したい関数とインターフェースの関数を合わせて、MATLAB
用のライブラリを作るためのコマンドです。ライブラリを作成するには、利用したい C++
関数の入ったファイルと、インターフェースの関数の入ったファイルの両方が必要です。

今回の場合は、AviReaderMex.cpp がそのインターフェースで、Video.cpp が利用したい C++ の関数 (の一部) だと思われます。

もし利用したい関数が Video.cpp に全部あるのなら

[code]

    mex AviReaderMex.cpp Video.cpp
    
[/code]

で、うまくいくと思いますが、もし他にも必要な関数やライブラリがある場合は、何が必要かを確認してください。

また、コマンドウィンドウで

[code]

    doc mex
    
[/code]

と入力して、ヘルプを確認することをお勧めします。


CC BY-SA 3.0
2017-11-17T17:51:08.793
39664
2017-11-17T17:51:08.793
3605
39658
answer