太长不看版: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. Densenet 相关

    https://github.com/flyyufelix/DenseNet-Keras

  2. 360 杀毒几K每秒的IO读取,SO MAD

    在没有用360杀毒扫描的状态下,从任务管理器中查看,居然有几K每秒的IO读取 . 好卡,直接卸载.

  3. 全选,反选,获取值ajax提交

    //必须先加载jquery //加载 弹出框插件 artdialog http://www.planeart.cn/demo/artDialog/ /****全选反选*开始**/ $(document ...

  4. bzoj4693: 雪中送温暖

    Description 每年的1月10日是温暖节,在这一天,化身出题人的C_SUNSHINE将会给OIer们送温暖.OIer们只要在门口放上一个 仙人掌,就能在早上的某个时刻听到门外传来一声:“开门, ...

  5. JavaScript之图片操作1

    在网页中,经常需要对图片经常各种操作,包括切换,轮播等等,接下来将总结一些常见的图片操作,首先是最简单前后切换. 如上面所示,通过点击右边的按钮切换左边的图片,为了实现想要的效果,首先,我们需要在ht ...

  6. 执行Chrome自动化时--正在受到自动软件的控制的显示屏蔽

    用selenium启动,浏览器出现‘Chrome正在受到自动软件的控制’ 屏蔽的方法: # coding:utf-8 from selenium import webdriver # 加启动配置 op ...

  7. 正则的使用及replace细讲

    1.var reg=/./ 与 var reg=/\./的区别? .代表任意一个字符 \.而后者代表这个字符串中得有一个. 2.?的使用 如果单独的一个字符后面带? /\d?/ 代表1个或0个这个字符 ...

  8. echo off

    就是说关闭回显 @echo off并不是DOS程序中的,而是DOS批处理中的.当年的DOS,所有操作都用键盘命令来完成,当你每次都要输入相同的命令时,可以把这么多命令存为一个批处理,从此以后,只要运行 ...

  9. Android ffmpeg rtmp(source code)

    souce code: Android.mk 编译生成APK需要调用的so文件 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODU ...

  10. Oracle 11g trace events

    oracle的events,是我们在做自己的软件系统时可以借鉴的 Oracle 11g trace eventsORA-10001: control file crash event1ORA-1000 ...