如何链接到共享库中定义了[abi:cx11]的函数



我正在使用nm工具查看共享库。我有这个库的两个版本,在每个版本上,我都有一个重载类型转换的定义,即

版本1

FrEspinosa@computerLinux:~frameworkPath1/lib$nm-D libcomm.so|c++filt|grep comm::InstanceID::operator

000cda80 T comm::InstanceID::operator std::__cxx11::basic_string<烧焦std::char_traits,std::allocater((const

版本2

FrEspinosa@computerLinux:~frameworkPath2/lib$nm-D libcomm.so|c++filt|grep comm::InstanceID::operator

00080ead T comm::InstanceID::operator std::__cxx11::basic_string<烧焦std::char_traits,std::分配器>[abi:cxx11]((const

这个>[abi:cxx11]是什么?我的函数签名/声明在头文件中应该是什么样子,这样它才能匹配版本2?我需要一个特殊的编译器标志,还是链接一个特殊库?

作为参考,与版本1成功链接的函数如下所示:

namespace comm {
struct InstanceID{
.
.
__attribute__ ((visibility("default"))) operator ipl::string () const;
}
}

编辑:

作为进一步的参考,im使用的编译器/链接器是

arm poky linux gneabi gcc(gcc(8.2.0

该库是用GNU 6.2.0 编译的

FrEspinosa@computerLinux:~/frameworkPath2/lib$strings-alibcomm.so|grep-i gcc

libgcc_s.so.1 GCC_3.5 GCC:(GNU(6.2.0compilerPath/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-GNUabi/6.2.0/include

所以我使用了一个更新的编译器。

ABI在C++11中发生了变化,这意味着对象的结构以及更重要的是它们的大小也发生了变化。为了防止有人链接到旧的ABI,编译器开始在对象名称中添加后缀[abi:cxx11]

这意味着,你正在浏览的库是用一个新的编译器编译的,而你正在使用的是老式的。你需要换一个新的编译器。

相关内容

  • 没有找到相关文章