簡體   English   中英

鏈接到靜態庫時未定義的引用錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM