OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 11491|回复: 15

OpenCV在Blackfin-uClinux下的使用测试问题

[复制链接]
发表于 2009-2-17 20:45:17 | 显示全部楼层 |阅读模式
OpenCV在Blackfin-uClinux下的编译通过,生成include-opencv和lib-opencv两个文件夹,分别包含了应有的头文件和静态库文件
编写简单的程序hello.c来测试库能否正常使用:
  1. #include "cv.h"
  2. #include "cxcore.h"
  3. #include "highgui.h"
  4. int main()
  5. {
  6.     cvNamedWindow("hello",CV_WINDOW_AUTOSIZE);
  7.     return 0;
  8. }
复制代码

新建目录hello,放入hello.c,并将include-opencv和lib-opencv两个文件夹中的所有.h和.a文件复制到hello文件夹中。
然后编译:
  1. bfin-uclinux-g++ -O2 -Wall -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -fno-builtin -I/HHBF531-R1/uClinux-dist -I/HHBF531-R1/uClinux-dist/linux-2.6.x/include -I./ -c -o hello.o hello.c
  2. //没有错误,生成了hello.o,继续:
  3. bfin-uclinux-g++ -Wl,-elf2flt -o hello hello.o libcv.a -I./ -L./ -lcxcore -lcv -lhighgui -lcvaux -lml -L/HHBF531-R1/uClinux-dist/lib/libnet -L/HHBF531-R1/uClinux-dist/lib/libdes -L/HHBF531-R1/uClinux-dist/lib/libaes -L/HHBF531-R1/uClinux-dist/lib/libpcap -L/HHBF531-R1/uClinux-dist/lib/zlib -L/HHBF531-R1/uClinux-dist/lib/libssl -L/HHBF531-R1/uClinux-dist/lib/uClibc/libcrypt
  4. //出现错误:
  5. hello.elf2flt(.text+0x110): In function `_main':
  6. : undefined reference to `_cvNamedWindow'
  7. collect2: ld returned 1 exit status
  8. //错误的同时,生成了hello.elf和hello.elf2flt两个文件
复制代码

链接错误,没有生成可执行文件,请教如何解决?
回复

使用道具 举报

发表于 2009-2-19 09:36:49 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

连接错误,没有找到函数的实现
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-19 09:54:15 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

连接错误,没有找到函数的实现

生成的所有头文件都放在了同一目录下,生成的静态库也都放在了同一目录下,包括libcv.a libcvaux.a libhighgui.a libcxcore.a libml.a;
而且在编译的时候加入了-I./命令以包含头文件,没有错误显示,在链接的时候加入了-L./ -lcxcore -lcv -lhighgui -lcvaux -lml命令以包含库文件,有错误显示

后来加入了命令-L./ -lcxcore -lcv -lhighgui -lcvaux -lml -lpthread,发现了问题:
大多数的非highgui的函数可以编译连接通过,并在目标板上正常运行,包括基本的矩阵函数等;
但是遇到highgui的相关函数就链接错误,提示找不到相关函数,但是库文件和头文件都有了,而且命令也完整了,按道理不应该找不到相关函数;
同时如果使用复杂的函数,比如角点检测cvGoodFeaturesToTrack(),编译链接通过,但在目标板上运行时会出现undefined instruction错误。

不知出现上面两个问题是何原因~
回复 支持 反对

使用道具 举报

发表于 2009-2-19 10:58:38 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

问题1:
bfin-uclinux-g++ -O2 -Wall -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -fno-builtin -I/HHBF531-R1/uClinux-dist -I/HHBF531-R1/uClinux-dist/linux-2.6.x/include -I./ -c -o hello.o hello.c
改成
bfin-uclinux-gcc
因为g++会按照c++的方式去处理hello.c中的symbol,处理之后的cvNamedWindow可能跟libcv.a中的该函数不一样了。
既然错误提示已经给出来了,那你可以这样看看:
bfin-uclinux-objdump -S libcv.a | grep cvNamedWindow(这里假设这个函数是在livcv.a中),看看在libcv.a中的函数token是什么。

最后链接的时候,如果所有库都是用gcc生成的,那么链接的时候也要用gcc,不要用g++。另外,删掉链接命令中hello.o后边的libcv.a,是多余的。

问题2:
-lpthread只是指定链接posix thread库,链接器会自行检查是否有用到这个库中的函数,不见得会有什么实质影响。

问题3:
如果仍然出现highgui的函数链接找不到,试试这样,把所有的库写两遍,即:
-lcxcore -lcv -lhighgui -lcvaux -lml -lpthread
变成
-lcxcore -lcv -lhighgui -lcvaux -lml -lpthread -lcxcore -lcv -lhighgui -lcvaux -lml -lpthread
如果仍然不行,你要给出更加详细的错误描述和输出信息。

问题4:
undefined instruction,首先你要搞懂这是什么意思。
未定义的指令,这类异常通常是由于除0或是浮点运算引起的。从编译命令来看,你用的是uclinux,而uclinux缺省使用uclibc,uclibc缺省可能不支持浮点运算。
解决方法,你可能要重新编译uclibc和uclinux,并且在编译这两者时都要指定使用soft-float,即软件模拟浮点运算。
回复 支持 反对

使用道具 举报

发表于 2009-2-19 12:29:00 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

[quote="Shiqi Yu":15r3h9vv]连接错误,没有找到函数的实现

生成的所有头文件都放在了同一目录下,生成的静态库也都放在了同一目录下,包括libcv.a libcvaux.a libhighgui.a libcxcore.a libml.a;
而且在编译的时候加入了-I./命令以包含头文件,没有错误显示,在链接的时候加入了-L./ -lcxcore -lcv -lhighgui -lcvaux -lml命令以包含库文件,有错误显示

后来加入了命令-L./ -lcxcore -lcv -lhighgui -lcvaux -lml -lpthread,发现了问题:
大多数的非highgui的函数可以编译连接通过,并在目标板上正常运行,包括基本的矩阵函数等;
但是遇到highgui的相关函数就链接错误,提示找不到相关函数,但是库文件和头文件都有了,而且命令也完整了,按道理不应该找不到相关函数;
同时如果使用复杂的函数,比如角点检测cvGoodFeaturesToTrack(),编译链接通过,但在目标板上运行时会出现undefined instruction错误。

不知出现上面两个问题是何原因~[/quote:15r3h9vv]
看看你的./configure输出,一般window函数需要gtk来编译的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-19 15:58:34 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

问题1:
bfin-uclinux-g++ -O2 -Wall -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -fno-builtin -I/HHBF531-R1/uClinux-dist -I/HHBF531-R1/uClinux-dist/linux-2.6.x/include -I./ -c -o hello.o hello.c
改成
bfin-uclinux-gcc
因为g++会按照c++的方式去处理hello.c中的symbol,处理之后的cvNamedWindow可能跟libcv.a中的该函数不一样了。
既然错误提示已经给出来了,那你可以这样看看:
bfin-uclinux-objdump -S libcv.a | grep cvNamedWindow(这里假设这个函数是在livcv.a中),看看在libcv.a中的函数token是什么。

最后链接的时候,如果所有库都是用gcc生成的,那么链接的时候也要用gcc,不要用g++。另外,删掉链接命令中hello.o后边的libcv.a,是多余的。

问题2:
-lpthread只是指定链接posix thread库,链接器会自行检查是否有用到这个库中的函数,不见得会有什么实质影响。

问题3:
如果仍然出现highgui的函数链接找不到,试试这样,把所有的库写两遍,即:
-lcxcore -lcv -lhighgui -lcvaux -lml -lpthread
变成
-lcxcore -lcv -lhighgui -lcvaux -lml -lpthread -lcxcore -lcv -lhighgui -lcvaux -lml -lpthread
如果仍然不行,你要给出更加详细的错误描述和输出信息。

问题4:
undefined instruction,首先你要搞懂这是什么意思。
未定义的指令,这类异常通常是由于除0或是浮点运算引起的。从编译命令来看,你用的是uclinux,而uclinux缺省使用uclibc,uclibc缺省可能不支持浮点运算。
解决方法,你可能要重新编译uclibc和uclinux,并且在编译这两者时都要指定使用soft-float,即软件模拟浮点运算。


RE Q1:重新检查了./configure的信息,并且看到make时的编译信息,确认编译库的时候用的是bfin-uclinux-g++,所以编译和链接测试程序hello.c时也使用的是bfin-uclinux-g++。
  1. ./configure --build=i686-pc-linux-gnu --host=bfin-unknown-uclinux --without-gtk --without-carbon --without-quicktime --without-1394libs--without-swig --without-python --enable-static --disable-shared --disable-apps CC=bfin-uclinux-gcc CXX=bfin-uclinux-g++
复制代码
输出信息为:
  1. General configuration
  2. =============================================
  3. Compiler: bfin-uclinux-g++
  4. CXXFLAGS: -Wall -fno-rtti -pipe -O3 -fomit-frame-pointer
  5. Install path: /usr/local
复制代码
使用bfin-uclinux-g++编译hello.c时,正常通过,无任何提示;链接时出现错误: undefined reference to "_cvNamedWindow";
而相同条件下使用bfin-uclinux-gcc编译hello.c时,编译通过,但有警告: \'cv...\' defined but not used ;链接时出现新的错误:
  1. hello.elf2flt(.text+0x202): In function `_main\':
  2. : undefined reference to `_cvNamedWindow\'
  3. hello.elf2flt(.text+0x128b0): In function `icvThickLine(CvMat*, CvPoint, CvPoint, void const*, int, int, int, int)\':
  4. cxdrawing.cpp: undefined reference to `_sqrt\'
  5. hello.elf2flt(.eh_frame+0x11): undefined reference to `___gxx_personality_v0\'
  6. hello.elf2flt(.eh_frame+0xa8d): undefined reference to `___gxx_personality_v0\'
  7. hello.elf2flt(.eh_frame+0xbb9): undefined reference to `___gxx_personality_v0\'
  8. hello.elf2flt(.eh_frame+0x161d): undefined reference to `___gxx_personality_v0\'
  9. hello.elf2flt(.eh_frame+0x19b1): undefined reference to `___gxx_personality_v0\'
  10. hello.elf2flt(.eh_frame+0x1a21): more undefined references to `___gxx_personality_v0\' follow
  11. collect2: ld returned 1 exit status
复制代码

RE Q2:加入-lpthread后错误减少,不过确实没有实质影响,主要是highgui库的问题。

RE Q3:看过这种解决方法,试了试,没有效果,但在后来的命令中一直保持这种命令方法。

RE Q4:这个问题应该就是浮点运算引起的,使用软件模拟浮点运算,或者进行算法移植,将浮点改成定点运算,应该可以消除。大概这就是为什么简单OpenCV函数能够在目标板运行,而复杂的函数则会出现 undefined instruction 错误的原因。看到有篇论文讲到相关的一些信息:
The OpenCV library uses floating point arithmetic whereas the Blackfin has no hardware support for it. In order for the programs not to run too slow on the Blackfin board, they have to be optimized. The Blackfin cross-compiler provides a soft float point library which emulates floating point arithmetic. This library is especially optimized for the Blackfin. By using the soft float point library, the execution time of the programs can be reduced by a 2 factor.
如果想得到较为理想的运算效果的话,还是需要将算法中的浮点运算转换成定点运算。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-19 16:30:35 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

[quote="whiteast":1e1jtqin][quote="Shiqi Yu":1e1jtqin]连接错误,没有找到函数的实现

生成的所有头文件都放在了同一目录下,生成的静态库也都放在了同一目录下,包括libcv.a libcvaux.a libhighgui.a libcxcore.a libml.a;
而且在编译的时候加入了-I./命令以包含头文件,没有错误显示,在链接的时候加入了-L./ -lcxcore -lcv -lhighgui -lcvaux -lml命令以包含库文件,有错误显示

后来加入了命令-L./ -lcxcore -lcv -lhighgui -lcvaux -lml -lpthread,发现了问题:
大多数的非highgui的函数可以编译连接通过,并在目标板上正常运行,包括基本的矩阵函数等;
但是遇到highgui的相关函数就链接错误,提示找不到相关函数,但是库文件和头文件都有了,而且命令也完整了,按道理不应该找不到相关函数;
同时如果使用复杂的函数,比如角点检测cvGoodFeaturesToTrack(),编译链接通过,但在目标板上运行时会出现undefined instruction错误。

不知出现上面两个问题是何原因~[/quote:1e1jtqin]
看看你的./configure输出,一般window函数需要gtk来编译的。[/quote:1e1jtqin]

之前一直使用
  1. ./configure --build=i686-pc-linux-gnu --host=bfin-unknown-uclinux --without-swig --without-python
复制代码
之后改成了
  1. ./configure --build=i686-pc-linux-gnu --host=bfin-unknown-uclinux --without-gtk --without-carbon --without-quicktime --without-1394libs--without-swig --without-python --enable-static --disable-shared --disable-apps CC=bfin-uclinux-gcc CXX=bfin-uclinux-g++
复制代码
但两者的输出是相同的
  1. General configuration ================================================
  2.     Compiler:                 bfin-uclinux-g++
  3.     CXXFLAGS:                 -Wall -fno-rtti -pipe -O3 -fomit-frame-pointer
  4.     Install path:             /usr/local
  5. HighGUI configuration ================================================
  6.     Windowing system --------------
  7.     Use Carbon / Mac OS X:    no
  8.     Use gtk+ 2.x:             no
  9.     Use gthread:              no
  10.     Image I/O ---------------------
  11.     Use libjpeg:              no
  12.     Use zlib:                 no
  13.     Use libpng:               no
  14.     Use libtiff:              no
  15.     Video I/O ---------------------
  16.     Use QuickTime / Mac OS X: no
  17.     Use xine:                 no
  18.     Use ffmpeg:               no
  19.     Use dc1394 & raw1394:     no
  20.     Use v4l:                  yes
  21.     Use v4l2:                 yes
  22. Wrappers for other languages =========================================
  23.     SWIG
  24.     Python                    no
  25. Additional build settings ============================================
  26.     Build demo apps           no
  27. Now run make ...
复制代码

改变命令,使用--with-gtk,输出结果同上,试了增加其它的如ffmpeg的支持,输出结果也同上。

如果想要支持highgui,就一定要开启gtk吗?如果一定的话,是否需要在uClinux上移植gtk?

[url:1e1jtqin]http://www.opencv.org.cn/index.php/%E5%B5%8C%E5%85%A5%E5%BC%8FARM%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%AE%89%E8%A3%85[/url:1e1jtqin]
在这个帖子中也使用了--without-gtk,但是最终测试drawing.c时里面包含了highgui库中的窗口函数,且测试通过,是不是板上操作系统里面有gtk的支持而使其通过,还是本身与gtk无关?
回复 支持 反对

使用道具 举报

发表于 2009-2-19 17:57:55 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

第一个问题,由于不清楚你的环境设置,还是先objdump看看再说吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-20 10:52:16 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

第一个问题,由于不清楚你的环境设置,还是先objdump看看再说吧。

输入命令:bfin-uclinux-objdump -S libhighgui.a | grep cvNamedWindow 无任何输出

[url:1fvapycc]http://3.bp.blogspot.com/_7HkTpeN7S4I/SZ4bi8wTU4I/AAAAAAAAAAc/gjN9pYA--iA/s1600-h/highgui.JPG[/url:1fvapycc]
如图所示,用objdump命令对highgui整个库中重要函数的检测情况为:

无任何输出:HighGUI简单图形界面 &  HighGUI实用函数与系统函数
有输出且包含相关函数名称:HighGUI读取与保存图像 &  HighGUI视频读写函数

例如对 cvLoadImage 进行测试的结果为:
  1. [root@white root]# bfin-uclinux-objdump -S libhighgui.a | grep cvLoadImage
  2. 00000180 <__Z12icvLoadImagePKcib>:
  3. 196:   06 18           IF CC JUMP 1a2 <__Z12icvLoadImagePKcib+0x22>;
  4. 1a0:   27 10           IF ! CC JUMP 1ee <__Z12icvLoadImagePKcib+0x6e>;
  5. 1d0:   60 18           IF CC JUMP 290 <__Z12icvLoadImagePKcib+0x110>;
  6. 1d4:   07 14           IF ! CC JUMP 1e2 <__Z12icvLoadImagePKcib+0x62>(BP);
  7. 208:   e1 1b           IF CC JUMP 1ca <__Z12icvLoadImagePKcib+0x4a>;
  8. 216:   32 18           IF CC JUMP 27a <__Z12icvLoadImagePKcib+0xfa>;
  9. 22c:   58 18           IF CC JUMP 2dc <__Z12icvLoadImagePKcib+0x15c>;
  10. 23e:   35 1c           IF CC JUMP 2a8 <__Z12icvLoadImagePKcib+0x128>(BP);
  11. 254:   5f 18           IF CC JUMP 312 <__Z12icvLoadImagePKcib+0x192>;
  12. 26c:   07 14           IF ! CC JUMP 27a <__Z12icvLoadImagePKcib+0xfa>(BP);
  13. 270:   31 1c           IF CC JUMP 2d2 <__Z12icvLoadImagePKcib+0x152>(BP);
  14. 27c:   a7 1b           IF CC JUMP 1ca <__Z12icvLoadImagePKcib+0x4a>;
  15. 28e:   a2 17           IF ! CC JUMP 1d2 <__Z12icvLoadImagePKcib+0x52>(BP);
  16. 292:   06 1c           IF CC JUMP 29e <__Z12icvLoadImagePKcib+0x11e>(BP);
  17. 29c:   9b 2f           JUMP.S  1d2 <__Z12icvLoadImagePKcib+0x52>;
  18. 2a6:   98 2f           JUMP.S  1d6 <__Z12icvLoadImagePKcib+0x56>;
  19. 2bc:   17 18           IF CC JUMP 2ea <__Z12icvLoadImagePKcib+0x16a>;
  20. 2d0:   c4 2f           JUMP.S  258 <__Z12icvLoadImagePKcib+0xd8>;
  21. 2da:   d0 2f           JUMP.S  27a <__Z12icvLoadImagePKcib+0xfa>;
  22. 2de:   a9 17           IF ! CC JUMP 230 <__Z12icvLoadImagePKcib+0xb0>(BP);
  23. 2e6:   a5 1f           IF CC JUMP 230 <__Z12icvLoadImagePKcib+0xb0>(BP);
  24. 2e8:   a3 2f           JUMP.S  22e <__Z12icvLoadImagePKcib+0xae>;
  25. 310:   b5 2f           JUMP.S  27a <__Z12icvLoadImagePKcib+0xfa>;
  26. 320:   ec 2f           JUMP.S  2f8 <__Z12icvLoadImagePKcib+0x178>;
  27. 00000324 <_cvLoadImage>:
  28. 32a:   ff e2 2b ff     JUMP.L  180 <__Z12icvLoadImagePKcib>;
  29. 00000330 <_cvLoadImageM>:
  30. 336:   ff e2 25 ff     JUMP.L  180 <__Z12icvLoadImagePKcib>;
复制代码
但对有输出或无输出的函数调用,链接时仍然出现相同的 undefined reference to 错误......
  1. #include &quot;cv.h&quot;
  2. #include &quot;cvaux.h&quot;
  3. #include &quot;highgui.h&quot;
  4. #include &quot;cxcore.h&quot;
  5. int main()
  6. {
  7.   IplImage* imgs = 0;
  8.   imgs =cvLoadImage(&quot;white.jpg&quot;);
  9.   return 0;
  10. }
复制代码
  1. &#91;root@white root&#93;# bfin-uclinux-g++ -O2 -Wall -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED -fno-builtin -I/HHBF531-R1/uClinux-dist -I/HHBF531-R1/uClinux-dist/linux-2.6.x/include -I./ -c -o hello.o hello.c
  2. &#91;root@white root&#93;# bfin-uclinux-g++ -Wl,-elf2flt -o hello hello.o -I./ -L./ -lcxcore -lcv -lhighgui -lcvaux -lml -lpthread -lcxcore -lcv -lhighgui -lcvaux -lml
  3. -lpthread -L/HHBF531-R1/uClinux-dist/lib/libnet -L/HHBF531-R1/uClinux-dist/lib/libdes -L/HHBF531-R1/uClinux-dist/lib/libaes -L/HHBF531-R1/uClinux-dist/lib/libpcap -L/HHBF531-R1/uClinux-dist/lib/zlib -L/HHBF531-R1/uClinux-dist/lib/libssl -L/HHBF531-R1/uClinux-dist/lib/uClibc/libcrypt
  4. hello.elf2flt(.text+0x67a): In function `__static_initialization_and_destruction_0(int, int)\':
  5. loadsave.cpp: undefined reference to `_cvShowImage\'
  6. hello.elf2flt(.text+0x67e):loadsave.cpp: undefined reference to `_cvShowImage\'
  7. collect2: ld returned 1 exit status
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-2-20 12:46:09 | 显示全部楼层

OpenCV在Blackfin-uClinux下的使用测试问题

HighGUI configuration ================================================

    Windowing system -------------- 下面三处都是no,那么你就不可以使用opencv的图形界面功能了
    Use Carbon / Mac OS X:    no
    Use gtk+ 2.x:             no
    Use gthread:              no

    Image I/O --------------------- 你不可以读写如下四种压缩格式
    Use libjpeg:              no
    Use zlib:                 no
    Use libpng:               no
    Use libtiff:              no

    Video I/O ---------------------  不可读写视频文件,但是可以通过v4l来从摄像头采集视频
    Use QuickTime / Mac OS X: no
    Use xine:                 no
    Use ffmpeg:               no
    Use dc1394 & raw1394:     no
    Use v4l:                  yes
    Use v4l2:                 yes
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-3-29 17:55 , Processed in 0.012103 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表