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

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

相关推荐
minji...12 分钟前
Linux 库制作与原理(三)深入动静态链接原理
linux·运维·服务器·c++
Queenie_Charlie1 小时前
Manacher算法
c++·算法·manacher
闻缺陷则喜何志丹1 小时前
【树的直径 离散化】 P7807 魔力滋生|普及+
c++·算法·洛谷·离散化·树的直径
计算机安禾1 小时前
【C语言程序设计】第35篇:文件的打开、关闭与读写操作
c语言·开发语言·c++·vscode·算法·visual studio code·visual studio
不想写代码的星星2 小时前
告别 C 风格枚举:为什么你应该使用 enum class
c++
m0_733612212 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
AI_搬运工2 小时前
从智能指针窥见现代C++的生存法则:告别内存泄漏,这篇就够了
c++
仰泳的熊猫2 小时前
题目2571:蓝桥杯2020年第十一届省赛真题-回文日期
数据结构·c++·算法·蓝桥杯
2301_807367192 小时前
C++中的模板方法模式
开发语言·c++·算法
tankeven3 小时前
HJ137 乘之
c++·算法