为什么在链接静态 (gSoap) 库的共享库时会出现未定义的符号?
Why do I get an undefined symbol when linking shared library that links static (gSoap) library?
我有一个动态库,它通过 linking 到 libgsoapssl++ 来提供 onvif 服务。我用 -fPIC 重新编译了来自 gsoap 的静态库。
然后我 link 这个动态库到一个使用它的服务的可执行文件。当我 运行 这个可执行文件时,我得到:
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 的更好替代方案,我将不胜感激。
感谢 Mike Kinghan 指出我应该看到的内容。
这里的问题是 /usr/lib 中共享库的旧版本,在我将 LD_LIBRARY_PATH 更改为指向 project-specific lib 目录后仍然存在。删除 /usr/lib 中的库解决了眼前的问题并导致访问正确的库实例。
我有一个动态库,它通过 linking 到 libgsoapssl++ 来提供 onvif 服务。我用 -fPIC 重新编译了来自 gsoap 的静态库。
然后我 link 这个动态库到一个使用它的服务的可执行文件。当我 运行 这个可执行文件时,我得到:
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 的更好替代方案,我将不胜感激。
感谢 Mike Kinghan 指出我应该看到的内容。
这里的问题是 /usr/lib 中共享库的旧版本,在我将 LD_LIBRARY_PATH 更改为指向 project-specific lib 目录后仍然存在。删除 /usr/lib 中的库解决了眼前的问题并导致访问正确的库实例。