因为stl ABI不一致造成的链接错误

本文探讨了在使用CMake连接多个库时遇到undefined symbol错误的常见原因,特别是在引入新库并设置GLIBCXX_USE_CXX11_ABI选项后。文章深入解释了ABI的概念,以及C++11后的新ABI标准如何影响库之间的兼容性,并提供了具体的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有这样一种现象,本来所有连接都好好的,通过cmake然后多连接一个库后,本来找得到的函数也出现大量的undefined symbol错误。

可能的原因是在新的库的findPackdge中设置了GLIBCXX_USE_CXX11_ABI这个选项。

先解释ABI是什么。ABI叫做程序二进制接口,就是编译出来的bianry文件之间的调用的规则。比如低版本的gcc编译出来的print函数,想要在高版本gcc编译出来的程序调用就需要瞒住一定的ABI要求。c++11后有新的ABI标准。也就是用新标准编译的库只能调用其他同样用新标准编译的库的函数。不然就会出现找不到函数定义的错误。

GLIBCXX_USE_CXX11_ABI是用来开关使用新版ABI还是老版的。

举例:libtorch官方提供的bianry就是用旧版ABI编译的,所以在c++11中使用libtorch必须自己打开GLIBCXX_USE_CXX11_ABI,重新源码编译libtorch。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值