我試圖編譯一個依賴於Xerces XML Parser的項目。該項目編譯Windows沒有任何困難,但我有一些麻煩在Cygwin編譯與g ++。鏈接到靜態庫時未定義的參考錯誤
爲了使用Xerces,我試圖編譯我的代碼對靜態庫libxerces-c.a
。但是,當我這樣做,我得到的是這樣的錯誤:
/tmp/cc2QGvMh.o:test.cpp:(.text+0x3a): undefined reference to `xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)'
我檢查使用ar
靜態庫,並證實它包含DOMImplementationRegistry.o
文件定義,我調用該函數。
ar -t libxerces-c.a
...
DOMImplementationImpl.o
DOMImplementationRegistry.o
DOMLocatorImpl.o
...
我還提取從庫中的目標文件,並用「納米」,以確保我打電話的功能確實存在:
ar -x libxerces-c.a
nm --demangle DOMImplementationRegistry.o
...
00000080 T xercesc_2_8::getDOMImplSrcVectorMutex()
00000300 T xercesc_2_8::DOMImplementationRegistry::getDOMImplementation(unsigned short const*)
000002a0 T xercesc_2_8::DOMImplementationRegistry::addSource(xercesc_2_8::DOMImplementationSource*)
...
因爲我可以爲Windows編譯一切但與g ++不同,我認爲錯誤可能在鏈接器順序中(類似於this question中描述的問題)。但是,即使更改鏈接器順序後,我仍然收到相同的編譯器錯誤。我曾經嘗試都
g++ -o test.exe test.cpp -Llib -lxerces-c
和
g++ -o test.exe test.cpp lib/libxerces-c.a
任何想法?
這可能是不同編譯器使用的不同名稱修改架構的問題。你能否在你的目標文件和庫上提供nm結果而沒有--demangle選項? – 2012-07-12 22:07:22
你使用的庫的正確分佈? xerces-c_2_8_0-x86-linux-gcc_3_4.tar.gz?還是你自己在gcc上建立圖書館? – carlsborg 2012-07-15 09:47:27