文件準備:OpenCV-2.0.0.tar.bz2 nios2gcc-20080203.tar.bz2
- 配置交叉編譯環境,參考我前面的博客DE2上移植uClinux系統
- 解壓OpenCV源文件:tar -xvf OpenCV-2.0.0.tar.bz2
- 配置編譯信息:
./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
- 編譯make(出錯)
- 安裝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函數還是能用的。上面這個問題帶我研究消滅之!!!!!!!!!!!!!!