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

原文地址:https://www.cnblogs.com/zzdyyy/p/8128032.html

时间: 2024-10-16 09:37:15

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

Linux OpenCV 静态链接错误

错误一: undefined reference to `dlopen' undefined reference to `dlerror' undefined reference to `dlsym' 对dlopen, dlerror, dlsym 未定义的引用, 缺少链接库, 链接时加上选项 -ldl 参考: http://blog.csdn.net/houjixin/article/details/8624581 http://stackoverflow.com/questions/2955

jquery不同版本冲突导致低版本功能不能用

oConflict() 方法让渡变量 $ 的 jQuery 控制权. 该方法释放 jQuery 对 $ 变量的控制. 使用方法: var jq = $.noConflict();//转换控制权 jq(document).ready(function () { jq("#outside").click(function () {你的操作...... }); }); }); jquery不同版本冲突导致低版本功能不能用,布布扣,bubuko.com

server version for the right syntax to use near &#39;USING BTREE 数据库文件版本不合导致的错误

MySQL 返回:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE,  KEY `lang` (`language_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8' at line 5 解决办法是打开要导入

ride.py在运行python3.&#215;版本后导致无法运行及解决办法

最近一直在自学python自动化,网上看到rf框架挺适合初学自动化测试,于是通过虫师的搭建了rf框架, 但是在使用过程中遇到了一个问题,在网上没有找到明确解决办法于是想到记录一下 之前为了搭建rf框架下载了python2.7版本,后面又想玩下爬虫于是下了python3.4版本结果出现了下面的问题:和往常一样切换到sripe输入ride.py,结果无法运行 后面网上找资料才发现是由于启动了python3版本后导致ride.py的启动方式发生了变化 1.进入C:\Python27\Scripts找到

PS cs6 打开高版本PSD导致异常

最近在开发一个红包活动,设计公司给到设计,在cs6上打开后,发现颜色不对,红包变成了青包 经过与设计公司沟通,发现可能是因为版本问题导致兼容不好,设计公司的PS版本已经是CC 2018. 无奈,使用各种笨方法,比如抠图,比如图片切割等 晚上回家后在自己电脑上安装了两个版本的PS(试用版) 经过一番努力,终于发现: CC 2018 图层效果可以重复,比如投影,渐变叠加可以有多个. 但是到了CS6,就会把多个相同的效果全部去掉,导致这些效果全部丢失,恰好设计公司就是使用效果做出的颜色,导致颜色丢失

Unable to import maven project: See logs for details :导致原因就是环境变量配置的maven版本与idea中的maven版本不一致导致的

百度很多都不对,后来受了启发:https://blog.csdn.net/ashleyjun/article/details/101106810想起来去看看环境变量了 导致原因就是环境变量配置的maven版本与idea中的maven版本不一致导致的 2019-11-05 20:19:41,358 [1307037] ERROR - #org.jetbrains.idea.maven - com.google.inject.CreationException: Unable to create i

cuda和NVDIA驱动版本不一致导致cuda不可用问题/require virtual c++ 14问题

cuda和NVDIA驱动版本不一致导致cuda不可用问题/require virtual c++ 14问题 待办 桌面鼠标右键查看NVIDIA版本,然后查看安装的cuda版本(conda list 或者 pycharm查看都可以) cuda版本和NVIDIA版本对照表 https://blog.csdn.net/heiheiya/article/details/103868478 因为显卡驱动版本一般都不会该所以这里就改cuda版本和cudatoolkit版本 cuda版本安装和环境变量配置 h

VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

Background MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Library: 开关 对应的库 版本 /MD MSVCRT.LIB 多线程DLL的Release版本 /MDd MSVCRTD.LIB 多线程DLL的Debug版本 /MT LIBCMT.LIB 多线程静态链接的Release版本 /MTd LIBCMTD.LIB 多线程静态链接的Debug版本 /clr MSVCMRT.LIB 托管代码和非托管代码混合 /clr:pure MSVCURT.LIB

jdk 版本不一致导致的错误

平时做项目时难免会从git,svn下载代码或者把别人的项目文件导入到自己的MyEclipse中进行操作,因此会遇到很多问题,常见的有一种是使用的jdk版本不一致造成的报错, 错误案例: 错误提示:com/shop/dao/AdminDao : Unsupported major.minor VERSION 51.0 错误解决办法:解决Unsupported major.minor VERSION 51.0错误 最近新安装使用了jdk7,编译了一些类替换到原来正常运行的项目中,替换之后发生了Uns