Linux 共享库链接错误(未定义符号)

Posted

技术标签:

【中文标题】Linux 共享库链接错误(未定义符号)【英文标题】:Linux Shared Library link error (undefined symbol) 【发布时间】:2018-01-26 13:04:09 【问题描述】:

我正在使用一个依赖于另一个的共享库。 libA.so 使用 libB.so。所有文件都使用 -fPIC 编译。链接使用-shared。当我在 libA.so 上调用 dlopen 时,它在 libB.so 中找不到符号,我收到“未定义符号”错误。

dlopen(/usr/share/orthanc/plugins/libA.so) 失败:错误 /usr/local/lib/libB.so:未定义符号: _ZN3Aws5Utils6Stream34DefaultResponseStreamFactoryMethodEv

ldd 返回:

libA.so:
linux-vdso.so.1 (0x00007ffc35b61000)
libB.so => /usr/local/lib/libB.so (0x00007fdb04999000)
libawss3cpp.so => /usr/local/lib/libawss3cpp.so (0x00007fdb0424b000)
libjsoncpp.so => /usr/local/lib/libjsoncpp.so (0x00007fdb03fd7000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdb03c55000)

当我尝试在库中找到这个符号时,它会返回:

nm -gC libB.so | grep 默认响应 Aws::Utils::Stream::DefaultResponseStreamFactoryMethod()

我在删除 libB.so 时收到文件未找到错误。

【问题讨论】:

你知道Aws::Utils::Stream::DefaultResponseStreamFactoryMethod()是在哪个库中定义的吗? 您的-l 是编译器的最后一个参数吗?在您对nm 的回复中,该符号前面是否有T 或其他内容? 是的,我使用 -l 作为最后一个参数。符号前面出现的字母是U 【参考方案1】:

我在 cmets 中询问 nm 的输出是否列出了 T 或其他值作为其值。你回答说是UU 代表 未定义。这意味着有问题的符号仅被此库引用(即,Aws::Utils::Stream::DefaultResponseStreamFactoryMethod() 的代码不是libB.so 的一部分)。

找到实际定义符号的库并链接该库。

【讨论】:

以上是关于Linux 共享库链接错误(未定义符号)的主要内容,如果未能解决你的问题,请参考以下文章

静态库链接错误。架构 armv7s 的未定义符号

在 Xcode 中构建反应本机项目的问题 - 错误:找不到自动链接库 + 未定义符号等

erlang nif共享库上的未定义符号

与共享库链接时未定义的引用

MFC 静态链接未解析的外部符号

静态库中的未定义符号链接到动态库