2011-02-24 77 views
0

未定义的符号将xerces与solaris sparc上的应用程序仅静态链接,而其他平台(Linux,HP-UX和Solaris-x86)上的静态链接正常工作时发生错误。Solaris上的静态链接问题sparc

以下是错误。

Undefined   first referenced 
symbol     in file 
void xercesc_2_8::JanitorMemFunCall<xercesc_2_8::XMLNotationDecl>::release() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(XMLNotationDecl.o) 
const xercesc_2_8::XMLAttr*xercesc_2_8::BaseRefVectorOf<xercesc_2_8::XMLAttr>::elementAt(const unsigned)const /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(SAX2XMLReaderImpl.o) 
void xercesc_2_8::RefHashTableOf<xercesc_2_8::KVStringPair>::put(void*,xercesc_2_8::KVStringPair*const) /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(DatatypeValidatorFactory.o) 
socket        /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(UnixHTTPURLInputStream.o) 
xercesc_2_8::SchemaElementDecl*xercesc_2_8::Janitor<xercesc_2_8::SchemaElementDecl>::release() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(TraverseSchema.o) 
void xercesc_2_8::ValueVectorOf<xercesc_2_8::DOMNode*>::addElement(xercesc_2_8::DOMNode*const&) /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(GeneralAttributeCheck.o) 
unsigned xercesc_2_8::RefHashTableOf<xercesc_2_8::XercesAttGroupInfo>::getHashModulus()const /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(XTemplateSerializer.o) 
bool xercesc_2_8::RefHashTableOf<xercesc_2_8::XMLAttDef>::containsKey(const void*const)const /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(TraverseSchema.o) 
void xercesc_2_8::JanitorMemFunCall<xercesc_2_8::IdentityConstraintHandler>::release() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(IdentityConstraintHandler.o) 
xercesc_2_8::XMLHolder<_pthread_mutex>::~XMLHolder() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(SolarisPlatformUtils.o) 
void xercesc_2_8::ValueHashTableOf<unsigned short>::put(void*,const unsigned short&) /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(GeneralAttributeCheck.o) 
void xercesc_2_8::ValueHashTableOf<unsigned>::put(void*,const unsigned&) /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(TraverseSchema.o) 
xercesc_2_8::RefVectorOf<xercesc_2_8::DOMImplementationSource>::~RefVectorOf() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(DOMImplementationRegistry.o) 
void xercesc_2_8::JanitorMemFunCall<xercesc_2_8::FieldValueMap>::release() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(FieldValueMap.o) 
void xercesc_2_8::Janitor<xercesc_2_8::SchemaAttDef>::orphan() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(TraverseSchema.o) 
xercesc_2_8::SchemaInfo&xercesc_2_8::BaseRefVectorEnumerator<xercesc_2_8::SchemaInfo>::nextElement() /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(TraverseSchema.o) 
void xercesc_2_8::BaseRefVectorOf<xercesc_2_8::ENameMap>::addElement(xercesc_2_8::ENameMap*const) /src/xerces_stat_libs/Solaris28-sun4/libxerces-c.a(TransService.o) 
+0

现在问题已解决。实际上,这是编译器缓存问题。我们删除了xerces静态库的编译器缓存,然后将其与二进制链接,并解决了问题。 – Sach 2011-03-07 06:46:37

回答

0

萨钦,你可以请你提供你的链接线,由你的构建系统报告?

这将显示正在使用哪些库的顺序和被调用的标志。 (我希望这是一个CC命令,而不是ld。)

同样为了响应Erik,Solaris 10确实支持静态链接 - 您可以将静态库(.a文件)与您的二进制文件链接 - 它所执行的操作不支持静态链接Solaris系统库。 Sachin,看起来像你将自己的静态xerces库与你的二进制文件链接起来的错误,在S10中很好。

+0

感谢您的建议。现在问题已解决。实际上,这是编译器缓存问题。我们删除了xerces静态库的编译器缓存,然后将其与二进制链接,并解决了问题。 – Sach 2011-03-07 06:46:02

0

您使用的是什么版本的solaris?如果它是solaris 10,那么你运气不好,它不再支持静态链接。 见here

0

就编译和链接而言,x86和SPARC上运行的Solaris没有区别。您当然可以在Solaris 10(和11)上构建和链接静态库。一个值得注意的例外是仅作为动态库提供的C库,但显示的错误消息与libc无关。

+0

运行一个没有libc的应用程序是相当困难的,我会想象的。 AFAIK glibc没有移植到solaris,但我可能是错的。 – Erik 2011-02-24 21:23:13

+0

对,这些错误与xerces库代码有关。顺便说一下,编译和链接是在Solaris 8 sparc上完成的。在Solaris 10上,它是成功的。 – Sach 2011-02-24 22:05:12

+0

@Erik:对于应用程序来说,libc确实是非常强制的(除非你编写替代系统调用接口),但是这并不妨碍为自己的库使用静态库,这就是我理解问题的方式。 – jlliagre 2011-02-25 07:12:02