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
或其他值作为其值。你回答说是U
。 U
代表 未定义。这意味着有问题的符号仅被此库引用(即,Aws::Utils::Stream::DefaultResponseStreamFactoryMethod()
的代码不是libB.so
的一部分)。
找到实际定义符号的库并链接该库。
【讨论】:
以上是关于Linux 共享库链接错误(未定义符号)的主要内容,如果未能解决你的问题,请参考以下文章