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

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

相关推荐
anew___5 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
stolentime7 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
tdtsmt8 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++
m0_7345717611 小时前
深入理解C++ 析构函数<一>基本概念
开发语言·c++
t-think12 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
cpp_learners12 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴12 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
David猪大卫14 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
广州山泉婚姻14 小时前
列表初始化:C++11全新初始化体系
c++·人工智能
莫生灬灬14 小时前
灵码 LingBuilder:用中文写代码,确定性生成真实 C++ 工程(开源)
c++·开源·mfc