2016-01-24 36 views
6

我在爲GCC中的C++ 11引入了新的ABI時遇到了問題。升級到GCC 5.3後,我的項目不再編譯。錯誤消息我得到的是簡單的:G ++新的ABI問題

undefined reference to `tokenize(std::__cxx11::basic_string' ...more characters 

undefined reference to `extract(std::string const&)' 

所以,它看起來像我搞砸的東西了和GCC是無法決定我是否要老ABI或新的之一( __cxx11::部分從一些錯誤消息中丟失,並出現在其他人中)?

我試了幾個解決方案來解決該問題:

  • 傳遞-D_GLIBCXX_USE_CXX11_ABI=0到GCC,
  • 傳遞-D_GLIBCXX_USE_CXX11_ABI=1到GCC,
  • 在源代碼中直接設置宏,
  • 設置abi_tag屬性關於海灣合作委員會在通過-Wabi-tag國旗時抱怨的聲明,

不幸的是,他們都沒有工作(即允許代碼編譯)。我知道的一件事是隻有返回std::string或將其作爲參數的函數無法鏈接。考慮到我在互聯網上看到的這個問題,這是預料之中的。我無法在一個簡單的示例程序中重現此問題,以便在此處顯示。

有沒有明顯的解決方案給我的問題,我失蹤了?

+2

這是一個鏈接器錯誤,而不是編譯器錯誤。它表明你試圖鏈接的編譯對象和庫是用不同的ABI編譯的。 – rici

+0

@rici是的,你是對的。我意識到問題發生在鏈接過程中。然而,它是編譯器發出的代碼被鏈接(或者我的理解缺乏?)。我不知道的是,爲什麼G ++有時會使用新的,有時甚至是舊的ABI發佈代碼,即使我正在對代碼進行完全重新編譯。 – Mael

回答

8

此錯誤表示您正在鏈接到某些未由gcc 5.3重新編譯的代碼或庫,並且由早期版本的gcc使用早期版本的ABI進行編譯。

如果您正在鏈接一些外部庫,除了標準C++庫外,這些外部庫需要重新編譯(並重新安裝)。

如果您沒有與任何外部庫鏈接,並且只將自己的代碼鏈接在一起,則某些源代碼模塊一定不能重新編譯。重新編譯一切。確保使用make clean或任何構建系統的等效項目擦除所有現有對象模塊。

+0

我只鏈接我自己的代碼。我也'make clean''d和'make recompile''d.Turns out我必須在我的Makefile中有一個錯誤。在我手動刪除所有'.o'文件後,我得到了一個不錯的,乾淨的測試傳遞構建。我接受你的答案。謝謝! – Mael

+0

我不知道你最終的解決方案是什麼。您是否需要手動將abi-tags添加到任何類或方法?我不知道是否舊代碼可以像以前一樣編譯(打破abi而不會產生任何錯誤) – Georg

+0

@Georg對不起,*非常*遲到的答案。我不需要做任何事情,只需要全面重新編譯。事實證明,我的Makefile中有一個bug(手寫),它刪除了所有'.o'文件;所以我混合使用舊ABI和新版本編譯的文件。事實證明,這並不是什麼神祕的東西。舊代碼「可以像以前一樣編譯」而不會破壞ABI。 – Mael