2011-02-24 74 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