神秘的"undefined reference"链接器错误
Mysterious "undefined reference" linker errors
对于一个大学项目,我正在为Android做一个手跟踪算法端口。代数。主要使用OpenCV函数。老实说,我真的不明白代数是什么。是的,但这不是我的问题。所以移植alg。我把一个正在工作的windows visual studio项目中的每个文件都添加到了我的android项目中,修复了一些编译器警告和错误。主要是成功。。。不幸的是,有一个文件让我担心了好几个小时。编译此文件会引发以下错误:
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvFindChessBoardCornerGuesses':
compat.cpp:(.text.cvFindChessBoardCornerGuesses+0x18): undefined reference to `cvFindChessboardCorners'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLines':
compat.cpp:(.text.cvHoughLines+0x46): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesSDiv':
compat.cpp:(.text.cvHoughLinesSDiv+0x54): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesP':
compat.cpp:(.text.cvHoughLinesP+0x52): undefined reference to `cvHoughLines2'
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvCalcEMD':
compat.cpp:(.text.cvCalcEMD+0x44): undefined reference to `cvCalcEMD2'
collect2: ld returned 1 exit status
有趣的是,唯一导致这个错误的线路是
nPointsConnected ++;
注释此行或减少nPointsConnected或设置类似nPointsCoonnected=1的值会使链接器错误消失。
项目中还有其他文件,包括相同的OpenCV头文件,正在编译。有人能向我解释一下吗?请
编辑这是环绕码:
if ( minK > FINGERTIP_ANGLE_THRESHOLD && minDir > 0 )
{
nPointsGap = 0;
if ( nPointsConnected == 0 )
{
startIndex = i;
}
nPointsConnected ++;
if ( minAngle < minK )
{
minAngle = minK;
minPointIndex = i;
}
fConnected = true;
mediumIndex += ( minK * i );
meanPointX += ( minK * contour[i].x );
meanPointY += ( minK * contour[i].y );
sumAngle += minK;
if ( fScreenshot )
{
cvCircle( pScreenshot_curvature, cvPoint(contour[i].x*2, contour[i].y*2),
4, CV_RGB(255,255,0), -1, 8, 0 );
cvCircle( pScreenshot_ellipse, cvPoint(contour[i].x*2, contour[i].y*2),
4, CV_RGB(255,255,0), -1, 8, 0 );
}
}
这看起来就像是您最终从-lopencv_legacy
中拉入了compat.o
对象文件,并且这个文件委托给了另一个实现。也就是说,您可能需要在-lopencv_legacy
之后指定-lopencv
。
我对Android或OpenCV一无所知,但这就是错误消息的样子。除非nPointsConnected
是某种类类型,否则您对问题原因的描述看起来有点奇怪。在这种情况下,增量运算符可能只在兼容库中实现,而其他操作在"真实"实现中可用。在对象文件上使用nm
,您可以找到更改后导致未定义的其他符号,然后查看它们是在哪个库中定义的。
只是澄清一下,因为这里的一些人认为问题不是导致这个错误的递增整数。此外,它是if条件中的方法调用
(nPointsConnected > SOMEVALUE)
我所要做的是更改OpenCV生成文件中OpenCV模块的顺序来自
OPENCV_MODULES := contrib calib3d objdetect features2d video imgproc highgui ml legacy flann core ts
至
OPENCV_MODULES := contrib legacy objdetect calib3d features2d video highgui imgproc ml flann core
其中遗留模块是要被替换的模块。(非常感谢android opencv邮件列表中指出这一点的人)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Visual Studio mkl_link_tool.exe链接错误
- C++ 实现模板单例类时出现链接错误
- 使用类模板的方法链接错误
- MySQL C++连接器链接错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 运行 C++ 单元测试时LNK2005链接错误
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 链接错误,包括我创建的相同头文件 - C++
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 使用标头保护的多个定义链接错误
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 升压program_options中的链接错误
- 使用 g++ 预处理器进行替换会导致链接错误
- 在调试配置中编译工作正常,但发布会给出链接错误
- 相邻矩阵设置链接错误
- 包含常量变量并包含在多个文件中的标头的链接错误
- C++链接错误,我理解但无法解决
- 是什么导致macOS Mojave上的GoogleTest链接错误