簡體   English   中英

靜態鏈接C ++和C庫時未定義的引用

[英]Undefined references when statically linking C++ and C libraries

我有3個我試圖鏈接的庫(不止這些,但這個解釋需要的只是)。 “root”庫是c ++,它有第二個庫作為它的依賴,也是c ++。 第三個庫是c並且是第二個庫的依賴。

當鏈接這個項目時,我得到了對從第二個庫(即c ++)調用的第三個庫(在c中)中的所有方法的未定義引用。 第三個庫將它的標題正確地包含在“extern”C“”中,因為它應該用於此類用途。

在嘗試對此進行故障排除時,我發現用於通知庫它正在構建為靜態的宏沒有正確設置,所以我修復了它並發現它改變了另一個放在所有c風格函數前面的宏從出口到代替說“extern”C“”。 回顧一下,在我修復了另一個宏之后,c ++庫中的c風格方法被聲明為“extern”C“”。 當我這樣做時,我在“根”庫中的第二個庫中調用的所有c風格的方法都開始得到未定義的引用。

我認為這很奇怪,因為我沒有看到其他庫沒有這樣做,所以我推薦了將宏定義為“extern”C“”的行的部分,而不是留空。 當我這樣做時,第二個庫中對c風格方法的未定義引用消失了,並返回了對第三個庫中方法的未定義引用。

我自己試圖對此進行研究,並且幾乎每個結果都是“放置”外部“C”在它的括號內!“但是,這已經是這種情況。我還認為它可能是一個鏈接器訂單問題,並驗證了在鏈接器命令中設置的鏈接器順序是合適的。所以我不知道是什么導致了這個。它似乎是一個名稱錯誤的東西,但我不能為我的生活發現這是怎么回事或者如何解決它。

我的問題:到底是怎么回事? 我可以探索哪些其他途徑來嘗試解決這個問題?

我使用的是32位Windows XP,使用MinGW進行編譯。 如果你想查看代碼......這有點復雜,因為這是一個大項目,但根庫是我正在研究的游戲引擎,第二個庫是cAudio,第三個庫是OpenAL soft 。 是repo的根目錄, 這里是cAudio的基本目錄, 是我們正在使用的OpenAL soft的基本目錄。

我為此感到抱歉這么久,感謝任何能夠做到這一點的人!

我設法找到了問題的原因。 簡短的版本是CMake配置錯誤。

長版本是我們在嘗試將庫構建為靜態時通過CMake手動添加定義(這是這里的情況)。 有一個用於cAudio和OpenAL。 當OpenAL編譯時,它使用了適當的CMake腳本部分中提供的定義。 這些定義未與層次結構中的其他項目共享。 因此,當cAudio編譯導出宏時沒有解決為空白,而是解決將其設置為“dllimport”。 當cAudio進行鏈接時,它期望帶有前綴為“_ imp ”的符號,這在編譯庫中並非如此。 因此導致我得到的未定義的引用。

我通過在cAudio CMake中添加適當的定義來解決這個問題,以便在使用OpenAL include編譯cAudio時正確解析導入宏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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