C++ ABI:编译报错之:gcc 4.8.1 切 gcc 6.1.0

1.问题背景

新建了个小项目,换了个编译环境,发现依赖库拷贝过来后,编译报错。编译器有差别:

  • 原来是 gcc 4.8.1
  • 新的环境是 gcc 6.1.0
    没想那么多,就是试着编译一下。总的还行,但是最后连接时,报错如下:

不要问为啥用这么老的编译器,在需求的环境是这样的。

shell 复制代码
kafkaproducer.o: In function `KafkaProducer::Start()':
/path/to/src/kafkaproducer.cpp:58: undefined reference to `RdKafka::Producer::create(RdKafka::Conf*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'       
/path/to/src/kafkaproducer.cpp:68: undefined reference to `RdKafka::Topic::create(RdKafka::Handle*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, RdKafka::Conf*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
kafkaproducer.o: In function `KafkaProducer::Produce(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int)':
/path/to/src/kafkaproducer.cpp:88: undefined reference to `RdKafka::err2str[abi:cxx11](RdKafka::ErrorCode)'
kafkaconsumer.o: In function `KafkaConsumer::Start()':
/path/to/src/kafkaconsumer.cpp:157: undefined reference to `RdKafka::KafkaConsumer::create(RdKafka::Conf*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' 
/path/to/src/kafkaconsumer.cpp:172: undefined reference to `RdKafka::err2str[abi:cxx11](RdKafka::ErrorCode)'
kafkaconsumer.o: In function `KafkaConsumer::HandleMsg(char const*, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int)':
/path/to/src/kafkaconsumer.cpp:275: undefined reference to `splitvector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
collect2: error: ld returned 1 exit status
make: *** [wd_svr] Error 1

排查与解决

其实上面的一大坨,看着挺有点摸不着头脑的。但是吧,静下心来,排除了可能的kafka库的连接问题后,直觉上发现个关键词:

std::__cxx11::basic_string

搜索后,发现是跟ABI有关,加上编译宏以后可以正常编译通过。

参考:C++ ABI 问题定位解决 https://zhuanlan.zhihu.com/p/125197727

还未完全掌握,后续需要再系统补充下该知识点。

相关推荐
路在脚下@5 小时前
C++ 知识体系
c++·1024程序员节
qq_310658515 小时前
webrtc代码走读(四)-QOS-NACK实现-发送端
c++·webrtc
长欢喜一场7 小时前
高精度算法全解析:从原理到实现
c++·1024程序员节
m0_748233647 小时前
单调栈详解【C/C++】
c语言·c++·算法·1024程序员节
Source.Liu7 小时前
【CMakeLists.txt】QtSvg 头文件包含配置详解
c++·qt·librecad
郝学胜-神的一滴7 小时前
Linux中的`fork`函数详解:深入解析
linux·服务器·开发语言·c++·算法
penguin_bark8 小时前
C++调用MySQL数据库完整教程
数据库·c++·mysql
让我们一起加油好吗8 小时前
【数论】欧拉定理 && 扩展欧拉定理
c++·算法·数论·1024程序员节·欧拉定理·欧拉降幂·扩展欧拉定理
Yupureki9 小时前
从零开始的C++学习生活 14:map/set的使用和封装
c语言·数据结构·c++·学习·visual studio·1024程序员节