Goland 调试Debug cgo opencv 项目报错未定义引用问题

问题

我的一个Golang项目中使用了基于cgo的opencv功能,在命令行中go build或者使用Goland的Run都可以正常地编译和运行,唯独点击了Debug按钮会报出如下的错误:

/tmp/go-build1999814797/b331/_x001.o:在函数 ‘cvContourPerimeter’:
/usr/local/include/opencv2/imgproc/imgproc_c.h:364:对 ‘cvArcLength’未定义的引用
...

尝试了在Goland中增加编译调试参数CGO_FLAGS也不行,去stack overflow问了也没有答案。最终自己摸索出了奇怪的方式解决。。。

解决

既然报错原因是cvArcLength未定义,那我就去看看呗。打开/usr/local/include/opencv2/imgproc/imgproc_c.h文件,查找这个cvArcLength的相关声明代码,发现它是长这样的:

/* Calculates perimeter of a contour or length of a part of contour */
CVAPI(double)  cvArcLength( const void* curve,
                            CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ),
                            int is_closed CV_DEFAULT(-1));
                            
CV_INLINE double cvContourPerimeter( const void* contour )
{
    return cvArcLength( contour, CV_WHOLE_SEQ, 1 );
}

CV_INLINE声明的函数中的使用有问题,不知道为什么导致了不能debug的问题,估计是调试和编译的内联优化问题导致的。所以我就把所有的CV_INLINE函数声明都注释掉了,因为我其实也没有用到这些函数。

/* Calculates perimeter of a contour or length of a part of contour */
CVAPI(double)  cvArcLength( const void* curve,
                            CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ),
                            int is_closed CV_DEFAULT(-1));
                            
//CV_INLINE double cvContourPerimeter( const void* contour )
//{
//    return cvArcLength( contour, CV_WHOLE_SEQ, 1 );
//}

好了,这下就可以调试了。

但是奇怪的是我后来把这些注释掉的函数取消注释了,您猜怎么着?Debug居然也还是可以使用,据另一个同事说他什么都没改,也能debug。。。太怪了,以后应该有机会知道为什么吧。

你可能感兴趣的:(opencv,Golang,Goland,cgo,调试)