一个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..这些选项的前面,就不会出现函数未定义的问题。
就这样算解决了把。以前我也遇到过由于链接库的位置不对而导致链接不正确的情况,看来编译器还不是那么智能啊,以后要小心了。