How to link to a function with [abi:cxx11] defined in a shared library?(如何链接到共享库中定义了[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]的函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何链接到共享库中定义了[abi:cxx11]的函数?
基础教程推荐
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01