gpt4 book ai didi

linux - 如何删除共享库中符号周围的字符?

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:47 27 4
gpt4 key购买 nike

我用 g++ 编译了一个库,我想用 gcc 链接它。
问题是链接时出现错误:

undefined reference to 'functionName`

(functionName为库中的函数名)

尽管该函数存在于符号列表中,并且我在链接时指定了 gcc 的路径。

发生这种情况是因为该函数出现在带有周围字符的列表中(我认为这是为了覆盖?):

Z12functionNameiSt9__va_list

我知道要删除这些字符,我应该用 extern "C" 将函数声明括起来。我这样做了:

//header.hpp
extern "C" int functionName(int argc, ...);

但周围的字符仍然出现在符号列表中的函数名称周围。这就是 gcc 找不到它的原因。

我在 Ubuntu 桌面 16 上使用 arm-poky-linux-gnueabi-gccarm-poky-linux-gnueabi-g++ 为 linux arm yokto 进行交叉编译.

为什么周围的字符没有被删除,我该如何删除它们?我永远不会重写这个函数,所以如果这些真的是为了重写,那么我就不需要它们。


编辑:

已解决。其声明中的函数签名与其定义中的签名不同...因此 extern 关键字毫无用处。

int functionName(int argc, ...); //declaration
int functionName(int argc, va_list args) //definition

最佳答案

这些字符是名称修饰。它们对函数签名进行编码,以便 C++ 重载可以正常工作(例如,int foo(int)int foo(float) 是不同的符号)。

如果您的 API 是 C 语言,则需要修复该库以免发生重整。将其构建为 C 或在其代码中添加 extern "C"。如果您的 API 是 C++,请从 header 中删除 extern "C"

如果经过修饰的名称不匹配(不同的修饰),那么您可能遇到了 ABI 兼容性问题。在那种情况下,试图解决链接问题是错误的解决方案。您需要确保使用与库相同的 ABI 构建代码。

c++filt 工具应该能够将错位符号解码为签名。这有助于找出差异所在。

鉴于您使用 g++ 构建了库并尝试与 gcc 链接,您可能需要一个 C API 并使用 extern 重建库“C" 到位就是您所需要的。

关于linux - 如何删除共享库中符号周围的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41267380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com