太长不看版: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的名字在目标代码里不一样,导致无法链接。

由于C++类库版本不同导致的OpenCV编译链接错误的更多相关文章

  1. Linux OpenCV 静态链接错误

    错误一: undefined reference to `dlopen' undefined reference to `dlerror' undefined reference to `dlsym' ...

  2. OpenCV多版本切换和配置--opencv 安装与卸载、添加 opencv_contrib modules 以及 OpenCv 多版本切换

    1. 查看安装Opencv的版本.以及libs和cflags $ pkg-config --modversion opencv $ pkg-config --cflags opencv // 编译链接 ...

  3. linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题

    linux内核默认会包含git的commit ID. 而linux的内核在insmod模块时,会对模块和内核本身的版本做严格的校验.在开发产品时,改动内核后,由于commit ID变更,会导致linu ...

  4. 生成war的jdk版本高于tomcat使用的jdk版本,导致项目不能正常被访问

    记录一个耽误30分钟的一个坑: 生成war的jdk版本高于tomcat使用的jdk版本,导致项目不能正常被访问 报404错误

  5. angular.js使用ui-router注入报错,这里是版本问题导致的

    报错如下: common.ts:604Uncaught SyntaxError: Unexpected token ) stateEvents.ts:211Uncaught SyntaxError: ...

  6. centos7安装Python3的过程中会和Python2.7版本冲突导致yum版本比对应,致使yum不能使用的问题。

    centos7安装Python3的过程中会和Python2.7版本冲突导致yum版本比对应,致使yum不能使用的问题. 原因:yum调用Python,启动程/usr/bin/yum就是一个python ...

  7. oracle:数据库版本问题导致的bug

    公司开发出来的系统,由于各现场oracle数据库版本有10.2.0.4.11.2.0.1.11.2.0.3.11.2.0.4: 进而会导致版本不一导致错误问题.下面列举2个: 1.wm_concat ...

  8. thrift 版本不一致导致 @Override 报错

    thrift 版本不一致导致 @Override 报错 学习了:http://blog.csdn.net/antony1776/article/details/78920888 版本不一致导致的: 在 ...

  9. ride.py在运行python3.×版本后导致无法运行及解决办法

    最近一直在自学python自动化,网上看到rf框架挺适合初学自动化测试,于是通过虫师的搭建了rf框架, 但是在使用过程中遇到了一个问题,在网上没有找到明确解决办法于是想到记录一下 之前为了搭建rf框架 ...

随机推荐

  1. JUC集合之 CopyOnWriteArrayList

    CopyOnWriteArrayList介绍 它相当于线程安全的ArrayList.和ArrayList一样,它是个可变数组:但是和ArrayList不同的时,它具有以下特性: 它最适合于具有以下特征 ...

  2. git revert回退时提示One or more files are in a conflicted state

    解决代码冲突 如果commit时出现“You have to update your work copy first.”红色警告,说明版本库中的此文件已经被其他人修改了. 请先点“ok”按钮退出.执行 ...

  3. 两数之和 Two Sum

    给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 n ...

  4. ProtocolBuffers (二) android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】

    protobuf 是什么?   Protocol buffers是一种编码方法构造的一种有效而可扩展的格式的数据. 谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区. 参考文档 http://c ...

  5. Guid 几种格式化

    //32 位数字:00000000000000000000000000000000 Console.WriteLine(Guid.NewGuid().ToString("N")); ...

  6. jsoncpp构造json字符串和json数组

    jsoncpp构造json字符串和json数组 参考文章:Jsoncpp的简单使用 下载json文件夹放在c++项目的include目录下,在CMakeLists中include进去,然后就可以在代码 ...

  7. c++开发环境搭建

    >>>>>>>>>>>>>>>>>>>>>开发环境搭建<<&l ...

  8. python&pandas 与mysql 连接

    1. python 与mysql 连接及操作,直接上代码,简单直接高效: import MySQLdb try: conn = MySQLdb.connect(host='localhost',use ...

  9. [Windows]Win10下VM虚拟机桥接模式无法上网的解决办法

    Win10出来了,赶紧尝尝鲜.既然是预览版,肯定会出现以前没有过的问题.这不,问题马上就来了.我的VM虚拟机本来在Win8.1下使用桥接模式是可以上网的,但是现在不可以了.重置了好几次虚拟网络,NAT ...

  10. 补充 3:Golang 一些特性

    1 丰富的内置类型 2 函数多返回值 3 Go的错误处理 :   Go语言引入了3个关键字用于标准的错误处理流程,这3个关键字分别为defer. panic和 recover 4 在Go语言中,所有的 ...