星期五, 3月 07, 2014

在 Matlab 上加值 mexopenCV 來使用 openCV的功能

我在前一篇,已經詳細的記錄了大部份要compile mexopenCV 的前置工作,但是在我下了下面的命令,還是遇到了error。
mexopencv.make('clean', true);
mexopencv.make


它一直出現類似:
Undefined symbols for architecture x86_64:
  "cv::merge(std::vector > const&, cv::_OutputArray const&)", referenced from:
      MxArray::toMat(int, bool) const in libMxArray.a(MxArray.o)
  "cv::split(cv::Mat const&, std::vector >&)", referenced from:
      MxArray::MxArray(cv::Mat const&, mxClassID, bool) in libMxArray.a(MxArray.o)
  "std::string::compare(char const*) const", referenced from:
      MxArray::toRange() const in libMxArray.a(MxArray.o)
  "std::string::_Rep::_M_destroy(std::allocator const&)", referenced from:...........
............

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

    mex: link of ' "+cv/CamShift.mexmaci64"' failed.

make: *** [+cv/CamShift.mexmaci64] Error 1


的錯誤。

心中難免murmur半天,官網寫的:"Usually it is as easy as typing mexopencv.make in matlab."難到是騙人的?沒差,反正小弟我也是從小被騙大的。

我直覺是compiler可能用錯了,導致很多程式連結都沒辦法連上。
我Google了一兩天,終於找到如何調整c的位置,請參考這一篇,要在shell中下指令:
cd /usr/bin
sudo ln -fs clang llvm-gcc-4.2
sudo ln -fs clang++ llvm-g++-4.2


接下來再make 一次,還是不行,因為有函數找不到(爆)
這次的錯誤訊息換成這個:
In file included from src/+cv/CamShift.cpp:7:
In file included from include/mexopencv.hpp:14:
In file included from include/MxArray.hpp:13:
In file included from /Applications/MATLAB_R2013a.app/extern/include/mex.h:58:
In file included from /Applications/MATLAB_R2013a.app/extern/include/matrix.h:294:
/Applications/MATLAB_R2013a.app/extern/include/tmwtypes.h:823:18: error: expected unqualified-id
typedef UINT16_T CHAR16_T;
                 ^
:2:18: note: expanded from here
#define CHAR16_T 1
                 ^


心中又開始OOXX,為什麼這位同學這個同學,都可以順利編過,啊我是要遇到幾次error才可以結束Loop呀?難到配備等級太高也是個錯誤(炸~~)。

找了很多,google了不少,甚至拿另一台macbook air來試,也是同樣的錯誤。最後竟然找到說,這是Visual Studio 2010的問題(爆)。
哇咧,我用的是mac osx + xcode,什麼時候和M$的Visual Studio有關係了?
倒是有一篇日本的討論,討論如何處理掉Visual Studio下的這個錯誤。

除此之外,真的找不太到有用的資訊,
我自已解析的結果,是compliler要處理指定"CHAR16_T"時,出現變數未指定的問題。

最後我參考了日本的討論,用了一個很暴力的方式。
我想,反正這一段是要傳遞如何定義文字變數的,如果我根本只傳數值變數,那我也不怎麼需要這些code。所以我到上層呼叫的matrix.h中,277行,找出
(位置在/Applications/MATLAB_R2013b.app/extern/include/matrix.h,不同的matlab版本,位置及行數都可能不同)

/*typedef CHAR16_T mxChar;*/
typedef CHAR16_T mxChar;


把它改成
/*typedef CHAR16_T mxChar;*/
typedef UINT16_T mxChar;


(在日本的討論中,是改成typedef unsigned short char16_t;)
同時把tmwtype.h中,830行附近處理CHAR16_T的一大段整個拿掉。
(位置在/Applications/MATLAB_R2013b.app/extern/include/tmwtype.h,不同的matlab版本,位置及行數都可能不同)。
#if (__cplusplus && defined(__STDC_UTF_16__)) || (defined(_HAS_CHAR16_T_LANGUAGE_SUPPORT) && _HAS_CHAR16_T_LANGUAGE_SUPPORT)
typedef char16_t CHAR16_T;
#elif defined(_MSC_VER)
typedef wchar_t CHAR16_T;
#else
typedef UINT16_T CHAR16_T;
#endif



這樣就平安的compile過了。只是,之後mexopenCV要和matlab互相傳遞文字訊息時,不知道會不會有問題。

沒有留言:

//for syntaxhighlighter 3 //看一下載入的JS模組有哪些,不要的就刪掉 //end syntaxhighlighter 3