我的应用程序抱怨找不到符号:
fatal: relocation error: file /foo/libxslt4c.so.113: symbol __1cDstdEcout_: referenced symbol not found (bar.c:1330)
并且ldd说同样的话:
ldd -d /bar/libxmllib.so
libc.so.1 => /lib/sparcv9/libc.so.1
[...]
libxml4c.so.58 => /foo/libxml4c.so.58
libxslt4c.so.113 => /foo/libxslt4c.so.113
[...]
/platform/SUNW,SPARC-Enterprise/lib/sparcv9/libc_psr.so.1
/lib/sparcv9/../libm/sparcv9/libm_hwcap1.so.2
symbol not found: __1cDstdEcout_ (/foo/libxslt4c.so.113)
symbol not found: __1cDstdEcerr_ (/foo/libxslt4c.so.113)
然而,符号就在那里 - 这就是nm所说的:
nm /foo/libxslt4c.so.113.0 | grep __1cDstdEcerr_
[10915] | 0| 0|OBJT |GLOB |0 |UNDEF |__1cDstdEcerr_
但是你可以看到:Shndx = UNDEF。那是什么意思?我想如果某些东西未定义,它根本就不存在。但不知怎的,它存在,虽然我的应用程序找不到它。
系统:Solaris 10 / UltraSPARC 我的应用程序和所有库都是64位,/ foo在LD_LIBRARY_PATH_64中(/ bar不是)。
编辑:同时我知道UNDEF就像“需要在另一个lib中解决”。我还发现了一个真正具有符号_ 1cDstdEcerr 的库 - 它是libCstd.so,它位于/ usr / lib中。或者更精确(因为我们需要64位变体)/ usr / lib / 64。所以它是由crle显示的系统默认库搜索路径之一。现在的问题是:当包含它的lib在系统的搜索路径中时,如何解析符号?
答案 0 :(得分:4)
它没有得到解决,大概是因为你没有将它包含在你的编译中 传递给链接器的标志。
如果你有
LDFLAGS += -lCstd
在你的Makefile中,它应该已经传递,链接器将传递
做了正确的事情(假设您正在使用标准编译
将$(LDFLAGS)
附加到编译器和链接器调用的规则。)