一个GCC4.6.3的奇妙问题的糊涂解决方案

因为工作中需要OpenCV,又不想用Windows,所以我就在Linux下编译安装OpenCV了。一开始,由于我的计算机不能安装ubuntu12.04,所以我安装了ubuntu13.04,opencv的环境也配置的很顺利。


Ubuntu 13.04 的编译问题与解决方案

在13.04上安装完成opencv后,我便兴冲冲的实验了一把,其实我的程序什么也没有做,只是添加了包含了opencv的头文件而已。然后我就编译呀。

 

// file : test.c

#include <opencv/cv.h>

#include <stdio.h>

#include <stdlib.h>

int main()

{

    return 0;

}


编译命令:

 

 

$ gcc -c test.c 

$ gcc test.o -o test


结果就输出了一堆如下的信息:

 

 

test.o:test.c:function cvDecRefData: error: undefined reference to 'cvFree_'

test.o:test.c:function cvDecRefData: error: undefined reference to 'cvFree_'

test.o:test.c:function cvGetRow: error: undefined reference to 'cvGetRows'

test.o:test.c:function cvGetCol: error: undefined reference to 'cvGetCols'

test.o:test.c:function cvReleaseMatND: error: undefined reference to 'cvReleaseMat'

test.o:test.c:function cvSubS: error: undefined reference to 'cvAddS'

test.o:test.c:function cvCloneSeq: error: undefined reference to 'cvSeqSlice'

test.o:test.c:function cvSetNew: error: undefined reference to 'cvSetAdd'

test.o:test.c:function cvGetSetElem: error: undefined reference to 'cvGetSeqElem'

test.o:test.c:function cvEllipseBox: error: undefined reference to 'cvEllipse'

test.o:test.c:function cvFont: error: undefined reference to 'cvInitFont'

test.o:test.c:function cvReadIntByName: error: undefined reference to 'cvGetFileNodeByName'

test.o:test.c:function cvReadRealByName: error: undefined reference to 'cvGetFileNodeByName'

test.o:test.c:function cvReadStringByName: error: undefined reference to 'cvGetFileNodeByName'

test.o:test.c:function cvReadByName: error: undefined reference to 'cvGetFileNodeByName'

test.o:test.c:function cvReadByName: error: undefined reference to 'cvRead'

test.o:test.c:function cvContourPerimeter: error: undefined reference to 'cvArcLength'

test.o:test.c:function cvCalcHist: error: undefined reference to 'cvCalcArrHist'

collect2: error: ld returned 1 exit status


我就纳闷了呀,我的程序里只是包含了头文件啊,怎么会使用opencv的函数呢,所以每必要产生这么多对opencv库函数的依赖呀!

 

于是,我看了看编译时产生的汇编代码,看看是否有啥蹊跷。

 

gcc -S test.c

 

打开test.s文件,看看,果然又很多opencv的库函数呢。于是我就开始添加opencv的库。最后就这样解决了。

 

$ gcc test.o -o test -lopencv_core -L/usr/local/lib -lopencv_highgui

 

 

12.04下gcc的问题与解决


跟在13.04下差不多的情况,按照上面的过程就可以解决了。

正当我为解决了这个问题高兴的时候,我遇到了新的问题。

一般我习惯把输入文件放到编译命令的最后,结果这样照样会出现问题。

出现问题的编译命令是:

 

$ gcc  -o test -lopencv_core -L/usr/local/lib -lopencv_imgproc test.o


我发现 只要把test.o放到-l..这些选项的前面,就不会出现函数未定义的问题。

 


就这样算解决了把。以前我也遇到过由于链接库的位置不对而导致链接不正确的情况,看来编译器还不是那么智能啊,以后要小心了。









 

你可能感兴趣的:(解决方案)