我正在使用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]
。
这意味着,你正在浏览的库是用一个新的编译器编译的,而你正在使用的是老式的。你需要换一个新的编译器。