链接链接静态(gSoap)库的共享库时,为什么会得到未定义的符号?

时间:2019-05-10 04:34:57

标签: c++ shared-libraries static-libraries gsoap

我有一个动态库,它通过链接到libgsoapssl ++提供了onvif服务。gsoap是一个静态库,我已经用-fPIC重新编译了它。

然后,我将此动态库链接到使用其服务的可执行文件。当我运行此可执行文件时,我得到:

symbol lookup error: /usr/lib/libonvif.so: undefined symbol: soap_base64o

该符号似乎已在动态库中定义,如nm所示:

nm libonvif.so | grep soap_base64

00000000008cec40 T soap_base642s
0000000000914b60 R soap_base64i
0000000000914bc0 R soap_base64o

可执行文件(onvifcl)似乎正确依赖于静态库(libonvif.so):

ldd onvifcl 

linux-vdso.so.1 (0x00007ffe623f6000)
libonvif.so => /usr/lib/libonvif.so (0x00007f4e09b86000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4e097fd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4e095e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4e091f4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4e08e56000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4e0aa54000)

我不知道为什么未定义符号。有人知道我在这里想念的吗?

顺便说一句,在开发针对我要解决的实际问题的潜在解决方法时,发生了此问题。我正在尝试使用boost.python来包装动态库的类,以便可以从Python3访问它。这样做仅在访问gsoap定义的结构或方法时才导致分段错误,这使我考虑了未解析的引用。将gsoap库编译为共享库可能会解决该问题,但是我在如何做到这一点上找不到很多。如果有人在这方面有任何想法,或者是boost.python的更好替代方案,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

感谢Mike Kinghan指出我应该看到的内容。

这里的问题是/ usr / lib中共享库的旧版本,当我将LD_LIBRARY_PATH更改为指向特定于项目的lib目录后,该旧版本仍然存在。删除/ usr / lib中的库可以解决当前的问题,并导致可以访问正确的库实例。