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

How to link to a function with [abi:cxx11] defined in a shared library?(如何链接到共享库中定义了[abi:cxx11]的函数?)
本文介绍了如何链接到共享库中定义了[abi:cxx11]的函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

版本1

FrEspinosa@computerLinux:~frameworkPath1/lib $nm-D libcom.so|c++Filt|grep comm::InstanceID::OPERATOR 000cda80 T comm::InstanceID::Operator std::__cxx11::BASIC_STRING<;char, Std::Char_Characters,std::allocator()const

版本2

FrEspinosa@computerLinux:~frameworkPath2/lib $nm-D libcom.so|c++Filt|grep comm::InstanceID::OPERATOR

00080ead T comm::InstanceID::Operator std::__cxx11::BASIC_STRING<;char, Std::char_特征,std::分配器>;[ABI:cxx11]()const

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

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

namespace comm {

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

编辑:

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

arm-poky-linux-gnueabi-GCC(GCC)8.2.0

该库是用GNU 6.2.0编译的

FrEspinosa@computerLinux:~/frameworkPath2/lib$字符串-a Libcom.so|grep-i GCC

Libgcc_s.so.1 GCC_3.5 GCC:(GNU)6.2.0 CompilerPath/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/6.2.0/include

所以我使用的是较新的编译器。

推荐答案

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

这意味着,您正在查看的库是使用较新的编译器编译的,而您正在使用的是旧样式的编译器。您需要使用新的编译器。

这篇关于如何链接到共享库中定义了[abi:cxx11]的函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Unknown type name __m256 - Intel intrinsics for AVX not recognized?(未知类型名称__M256-英特尔AVX内部功能无法识别?)
How can an declare an array in a function that returns an array in c++(如何在用C++返回数组的函数中声明数组)
Is it possible to define a class in 2 or more file in C++?(在C++中可以在两个或多个文件中定义一个类吗?)
Why can#39;t I create an array of automatic variables?(为什么我不能创建一个自动变量数组?)
zeromq: reset REQ/REP socket state(Zeromq:重置REQ/REP套接字状态)
Can I resize a vector that was moved from?(我可以调整从中移出的矢量的大小吗?)