在编译一个项目时候出现 “undefined reference to cv::line” 的错误,是在链接其中一个静态库的时候出现的错误,错误如下:
/home/build/lib/libapriltags.a(TagDetection.cc.o): In function `AprilTags::TagDetection::draw(cv::Mat&) const':
TagDetection.cc:(.text+0x960): undefined reference to `cv::line(cv::Mat&, cv::Point_<int>, cv::Point_<int>, cv::Scalar_<double> const&, int, int, int)'
TagDetection.cc:(.text+0x9f9): undefined reference to `cv::line(cv::Mat&, cv::Point_<int>, cv::Point_<int>, cv::Scalar_<double> const&, int, int, int)'
TagDetection.cc:(.text+0xa93): undefined reference to `cv::line(cv::Mat&, cv::Point_<int>, cv::Point_<int>, cv::Scalar_<double> const&, int, int, int)'
TagDetection.cc:(.text+0xb06): undefined reference to `cv::line(cv::Mat&, cv::Point_<int>, cv::Point_<int>, cv::Scalar_<double> const&, int, int, int)'
就上网查了一下,发现很多关于undefined reference这样的问题,但是原因大多很复杂,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对其他遇到这种问题的有所帮助。
经过多方面的排查发现,出现这个原因是因为AprilTags这个静态库的问题。 由于这个代码是从别人那接手的,在配置环境的过程中出现的这个问题。由于AprilTags这个静态库别人在编译的时候是基于他的环境,即基于opencv2.4.8编译的,我用的环境是opencv3.1.0的版本,但是之前不知道是这个问题。
所以解决办法有两种,一种是使用和AprilTags这个静态库编译时相同的opencv版本,即使用opencv2.4.8, 另一种方法是 在opencv3.1.0下重新将AprilTags这个静态库编译一遍。
一般出现这种问题都很隐秘,在解决的时候要多方面排查。