Skip to content

一个gcc版本的坑,以及解决方案

一个gcc版本的坑,以及解决方案 published on No Comments on 一个gcc版本的坑,以及解决方案

背景:
写程序可能要用到OpenMesh的库,去网上下了一个,编译安装,一切顺利。使用最简单的例子,qmake来配置,编译,出现问题
error: undefined reference to `OpenMesh::IO::_IOManager_::write(std::__cxx11::basic_string, std::allocator > const&, OpenMesh::IO::BaseExporter&, OpenMesh::IO::Options, long)'
看起来是很简单的问题,以前碰到很多次了,不就是链接的时候找不到库函数嘛,查看是否把库都包含进来了,咦,没问题啊,OpenMesh的两个库都在qmake包括了。以为是qt的锅,试了qt5, qt4,还是不行,算了不用qmake,直接写makefile,依然不行。

然后想起来是不是OpenMesh编译的库出现了问题。看到网官上是用cmake来配置的,好吧,上cmake,编译运行,成功。看来库并没有问题。

问题陷入僵局,回家后把OpenMesh和编译重新在家里电脑上编译一遍,一次通过。纠结了。

分析问题:
家里电脑的gcc是系统自带的5.x版,单位电脑是系统自带4.8带,我自己下载安装了5.2版。难道只有系统自带才可以?把单位电脑换4.8版,成功。
看似解决问题了,但根本说不通。难道是gcc安装的时候参数选择的问题?我一个参数一个参数的对照,发现没并有什么问题。
突然想到,是不是编译的库的gcc版本和运行gcc版本不同所造成的?查了一下cmake的默认编译器,果然是系统自带的。重新编译,CC=gcc CXX=g++ ccmake ../,安装,然后再用5.2来编译程序,成功。系统4.8编译,失败

关于cmake的设置
参考https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F
CC=gcc-4.2 CXX=/usr/bin/g++-4.2 cmake -G "Your Generator" path/to/your/source 或者
cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source
如果想看具体命令
make VERBOSE=1

果然问题就出现在这,可是为什么之前从来没出现过这种问题呢?
https://www.zhihu.com/question/51932153
这个页面已经讲的很详细了,在gcc4到gcc5的时候,ABI发生了变化,如果有string之类的暴露在二进制边界,就可能出现问题

GCC5 and the C++11 ABI


这个页面也说到了,如果错误信息有__cxx11之类的,8成是这个问题,也提出了解决方案

这个锅,库的编写者需要背一些。

看来可以告一段落了。c++的坑实在太多了。

另:
查看调用了哪些库
ldd binary

Leave a Reply

Your email address will not be published. Required fields are marked *