我在爲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
或將其作爲參數的函數無法鏈接。考慮到我在互聯網上看到的這個問題,這是預料之中的。我無法在一個簡單的示例程序中重現此問題,以便在此處顯示。
有沒有明顯的解決方案給我的問題,我失蹤了?
這是一個鏈接器錯誤,而不是編譯器錯誤。它表明你試圖鏈接的編譯對象和庫是用不同的ABI編譯的。 – rici
@rici是的,你是對的。我意識到問題發生在鏈接過程中。然而,它是編譯器發出的代碼被鏈接(或者我的理解缺乏?)。我不知道的是,爲什麼G ++有時會使用新的,有時甚至是舊的ABI發佈代碼,即使我正在對代碼進行完全重新編譯。 – Mael