2012-07-06 119 views
4

我試圖編譯一個依賴於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 

任何想法?

+0

這可能是不同編譯器使用的不同名稱修改架構的問題。你能否在你的目標文件和庫上提供nm結果而沒有--demangle選項? – 2012-07-12 22:07:22

+0

你使用的庫的正確分佈? xerces-c_2_8_0-x86-linux-gcc_3_4.tar.gz?還是你自己在gcc上建立圖書館? – carlsborg 2012-07-15 09:47:27

回答

4

你沒有說出檔案的來源。如果它沒有用cygwin編譯,它可能是一個名稱混淆問題。從源代碼編譯庫可能會解決這個問題。

也可能是因爲檔案的構建不正確而導致內部出現分辨率問題。嘗試給庫名稱兩次。

g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a 

如果這個工作,存檔被打破,你應該尋找或建立一個新的。

+0

感謝您的建議。我使用的檔案沒有用Cygwin編譯。我編譯了源代碼中的所有內容,並解決了鏈接器錯誤。謝謝您的幫助! – theisenp 2012-07-15 16:46:30

7

您的項目使用來自xercesc_2_6命名空間的方法,正如編譯器錯誤消息指出的,但您的庫提供了xercesc_2_8版本。問題可能是由您使用的標題與庫對象文件之間的不匹配造成的。

+0

謝謝,趕上!我修復了項目使用xerces_2_8的頭文件和庫,但我仍然得到相同的錯誤。我已更新我的問題以反映新版本。 – theisenp 2012-07-06 18:51:13

1

嘗試鏈接器選項--enable-stdcall-fixup(請參閱'man ld')。它會關心名稱修改和調用約定:

g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c 
相關問題