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

1.问题背景

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

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

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

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值