2015-10-31 63 views
1

我有一個與Boost(版本1.58)奇怪的鏈接問題。我在Ubuntu 15.10上使用g ++ 4.8編譯。Boost鏈接錯誤 - 單個未定義的參考

我得到以下錯誤:

undefined reference to 'boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)' collect2: error: ld returned 1 exit status

什麼奇怪的是,從lboost_program_options所有其他符號如發現; options_description是唯一未定義的參考。如果我註釋掉options_description的用法,但是繼續使用positions_options_description(我也在使用它),那麼整個程序將完美地編譯和鏈接。我正在鏈接-lboost_program_options,如果我按照預期刪除它,那麼有8個缺失boost :: options_description符號。

很長一段時間鏈接工作正常。沒有任何構建系統的變化,我知道它突然崩潰。唯一的系統級別更改是升級到Ubuntu 15.10,我認爲這不會影響任何內容。

任何想法或建議表示讚賞。

更新:經過大量的擺弄之後,我再次得到這個工作,雖然我不確定它是什麼。我仍然對任何可能導致這種行爲的答案感興趣。

+0

升級你的操作系統幾乎肯定會升級很多軟件包。很可能您使用apt-get安裝了boost(-dev),並且它現在處於更新的版本。 – Kenney

+0

這是可能的,但我不明白爲什麼會導致此錯誤。我檢查了一下,以確保在當前版本的boost中API和包裝是相同的。 –

回答

0

檢查ABI是否兼容(編譯boost庫時使用的是相同的編譯器版本和標誌)。

在Ubuntu上,這意味着使用庫存GCC和libstdC++。

如果您不能,請使用您的首選標誌編譯您自己的Boost System和Boost Program Options二進制文件。

如果您的編譯器與編譯boost時使用的編譯器不同,類似的東西會阻止代碼示例在http://coliru.stacked-crooked.com上鍊接。

+0

你能解釋一下答案嗎?我有同樣的問題,你的答案似乎是我需要的。我嘗試了很多在線解決方案,但都沒有成功。 – smttsp

0

升級到Ubuntu 15.10後,我遇到了類似的問題,在屬於boost::program_options的lib中丟失了一個不同的符號。

它幫助簡單地清理整個項目,扔掉所有的目標文件等,並重新編譯它從頭開始。

+0

有趣的是,聽到這也影響了其他人。我絕對嘗試過立即「乾淨」。 –

+0

更準確地說,我在我的應用程序和'boost :: program_options'之間實現了一個接口庫,它將靜態鏈接到我的應用程序。我還需要清理lib項目以使其工作。可以肯定的是我手動做到了這一點。 – bjhend

相關問題