OpenCV 2.0.0在基於Nios II uClinux系統上的移植

文件準備:OpenCV-2.0.0.tar.bz2 nios2gcc-20080203.tar.bz2

  1. 配置交叉編譯環境,參考我前面的博客DE2上移植uClinux系統
  2. 解壓OpenCV源文件:tar  -xvf OpenCV-2.0.0.tar.bz2
  3. 配置編譯信息:
    ./configure --host=nios2-linux --without-gtk --without-carbon--without-quicktime --without-1394libs --without-ffmpeg --without-python--without-swig –without-v4l --enable-static --disable-shared --disable-appsCXX=nios2-linux-g++ --prefix=/home/dh/Sopc/OpenCV-2.0.0/build
  4. 編譯make(出錯)
  5. 安裝make install

遇到的主要問題:

錯誤1:error:  "__exchange_and_add"  was not declared in this scope。Google之,發現和編譯器版本有關,nios2-linux-g++ 的版本爲3.4.6,而cxoperations.h預處理命令中只有gcc版本大於4才能編譯通過。索性將判斷條件改爲3,這個問題就解決了。

#if __GNUC__*10 + __GNUC_MINOR__ >= 42

    #if !defined WIN32 && (defined __i486__ || defined __i586__ || \
        defined __i686__ || defined __MMX__ || defined __SSE__  || defined __ppc__)
      #define CV_XADD __sync_fetch_and_add
    #else
      #include <ext/atomicity.h>
      #define CV_XADD __gnu_cxx::__exchange_and_add
    #endif

  #else
    #include <bits/atomicity.h>
    #if __GNUC__ >= 3				// 4 formerly, Changed by DH on 2012-12-23 21:04
      #define CV_XADD __gnu_cxx::__exchange_and_add
    #else
      #define CV_XADD __exchange_and_add
    #endif
  #endif

錯誤2:macro "index" requires 2 arguments, but on file cxcore.h, function index only one argument. 而error : expected ";" before "const"是由前者引起的。即錯誤原因是不知到在什麼地方定義了一個帶有兩個參數的“index”宏,且這個宏是小寫的。我找了下,沒有在opencv的頭文件中找到。只好在文件開頭取消這個宏的定義:

// Added by DH on 2012.12.24 17:05
#ifdef index
#undef index
#endif
// Added by DH on 2012.12.24 17:05

解決了這兩個錯誤,在make和make install,就成功生成了靜態庫。

這邊博客實在Tyreal Han的OpenCV在基於FPGA的嵌入式系統上的移植研究的基礎上編譯成功的。在此向前輩表示感謝。


However, 在用命令編譯源程序時出錯:undefined reference to 'lrint'。而這個錯誤在沒有配置編譯信息時沒有添加“--disable-apps"參數的情況下也會出現。

不能不說這這是個遺憾啊,在這個平安日裏。不過今天還是收穫頗多的。

nios2-linux-g++ -Wall -o bmpShow bmpShow.cpp -I/home/dh/Sopc/OpenCV-2.0.0/build/include/opencv -L/home/dh/Sopc/OpenCV-2.0.0/build/lib -lcv -lcvaux -lcxcore -lml -lpthread -elf2flt




不過經我測試,編譯好的OpenCV2.0.0靜態庫並非全都不能用。最簡單的CvMat和cvmGet函數還是能用的。上面這個問題帶我研究消滅之!!!!!!!!!!!!!!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章