zoukankan      html  css  js  c++  java
  • 由于C++类库版本不同导致的OpenCV编译链接错误

    太长不看版:GCC4和GCC5使用的C++标准库下,string的名字不一样,导致链接错误。

    之前在Ubuntu下使用OpenCV的时候一切正常。后来再次编译的时候,连接器提示有些库函数找不到:

    main.o:在函数‘main’中:
    main.cpp:15:对‘cv::imread(std::string const&, int)’未定义的引用
    main.cpp:22:对‘cv::namedWindow(std::string const&, int)’未定义的引用
    main.cpp:23:对‘cv::imshow(std::string const&, cv::_InputArray const&)’未定义的引用
    collect2: error: ld returned 1 exit status
    

    源文件里还使用了其他的库函数,为什么只有这几个函数找不到?后来排除了大量错误,确定不是因为找不到库文件,坑爹的bug。。。

    对输出的目标文件进行分析,列出其符号表:nm -c main.cpp.o ,发现它引用了外部的符号:

    ...
                     U cv::imread(std::string const&, int)
                     U cv::namedWindow(std::string const&, int)
                     U cv::imshow(std::string const&, cv::_InputArray const&)
    ...
    

    查找资料,得知这些函数来自opencv_highgui库文件(/usr/lib/x86_64-linux-gnu/libopencv_highgui.so ),同样可以列出它的符号表nm -C opencv_highgui.a(对应的静态库):

    ...
    0000000000000000 T cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)
    0000000000000000 T cv::namedWindow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)
    0000000000000000 T cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)
    ...
    

    能够看出库函数的原型,和我自己的程序中的原型不一致。仔细对比,是标准库string的名字不一样。我自己的程序里是std::string 在库里是std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >

    后来才想起,前段时间为了兼容MATLAB安装了GCC4.9版本(和C++标准库)。再恢复GCC5.x版本编译、链接,没有再次出现问题。

    总结一下,是因为我的OpenCV库是Ubuntu官方使用C++5的标准库编译出来的,而自己写的程序是C++4.9的库。两个库里标准库string的名字在目标代码里不一样,导致无法链接。

  • 相关阅读:
    递归运用实例
    动手动脑(&课后实验):生成随机数,函数的重载
    求一个数字的每位上的数字并求和
    要求根据RandomStr.java:使用类型转换生成六位验证字符串,示例程序每次运 行时,都会生成不同的字符串。
    Java语言基础问题
    从命令行接收多个数字,求和输出结果
    《大道至简》第一章读后感Java伪代码
    《大道至简》读后感
    怎样关闭WIN7系统的自动更新
    Mongodb集群搭建的三种方式
  • 原文地址:https://www.cnblogs.com/zzdyyy/p/8128032.html
Copyright © 2011-2022 走看看