[英]Undefined Reference Error When Linking to Static Library
我正在嘗試編譯依賴於Xerces XML Parser的項目 。 該項目沒有任何困難地為Windows編譯,但我在使用Cygwin中的g ++編譯時遇到了一些麻煩。
為了使用Xerces,我試圖針對靜態庫libxerces-ca
編譯我的代碼。 但是當我這樣做時,我會得到如下錯誤:
/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
...
我還從庫中提取了目標文件,並使用'nm'來確保我調用的函數實際存在:
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 ++編譯,我認為錯誤可能在鏈接器順序中(類似於此問題中描述的問題 )。 但是,即使更改了鏈接器順序,我仍然會得到相同的編譯器錯誤。 我試過了兩個
g++ -o test.exe test.cpp -Llib -lxerces-c
和
g++ -o test.exe test.cpp lib/libxerces-c.a
有任何想法嗎?
您的項目使用xercesc_2_6命名空間中的方法,如編譯器錯誤消息所指示,但您的庫提供xercesc_2_8版本。 問題可能是由您使用的標頭與庫對象文件不匹配引起的。
你沒有說出檔案的來源。 如果它不是用cygwin編譯的,那么它可能是一個名稱錯誤問題。 從源代碼編譯庫可能會解決這個問題。
也可能是存檔構建錯誤,因此存在內部分辨率問題。 嘗試兩次提供庫名稱。
g++ -o test.exe test.cpp lib/libxerces-c.a lib/libxerces-c.a
如果這樣做,存檔就會中斷,您應該查找或構建一個新存檔。
嘗試使用鏈接器選項--enable-stdcall-fixup(參見'man ld')。 它將關注名稱修改和調用約定:
g++ -o test.exe test.o -Wl,--enable-stdcall-fixup -Llib -lxerces-c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.