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

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

相关推荐
拳里剑气4 小时前
C++算法:多源BFS
c++·算法·宽度优先·多源bfs
ysa0510305 小时前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子
aramae7 小时前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端
_wyt0017 小时前
c++里的族谱:树
c++·
@三十一Y8 小时前
C++:AVL树实现
c++
haolin123.9 小时前
类和对象(上)
开发语言·c++
ShineWinsu9 小时前
对于Linux:传输层协议UDP原理的解析
linux·c++·面试·udp·协议·传输层·计算机系统
LingzhiPi9 小时前
零知派ESP32--AS5600磁吸旋钮音量控制器
c++·单片机·嵌入式硬件
小保CPP9 小时前
OpenCV C++车型识别1-图像预处理
c++·人工智能·opencv·计算机视觉
库克克10 小时前
【C++】C++11 包装器function 与 绑定器 bind
开发语言·c++