我嘗試瞭解如何解決GCC 5中引入的雙重ABI問題。但是,我沒有設法做到這一點。這裏是一個非常簡單的例子來重現錯誤。我使用的GCC版本是5.2。正如你所看到的,我的主要功能(在main.cpp中的文件)很簡單:如何處理GCC 5中的雙重ABI?
// main.cpp
#include <iostream>
#include <string>
int main()
{
std::string message = "SUCCESS!";
std::cout << message << std::endl;
}
當我鍵入
/home/aleph/gcc/5.2.0/bin/g++ main.cpp
我收到以下錯誤信息:
/tmp/ccjsTADd.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
main.cpp:(.text+0x43): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
main.cpp:(.text+0x5c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
main.cpp:(.text+0x8c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
collect2: erreur: ld a retourné 1 code d'état d'exécution
如果我將_GLIBCXX_USE_CXX11_ABI
的值更改爲0,則問題消失。
但是,如何使用默認的ABI工作?
編輯:簡單的問題(去除CMake的腳本)
在兩種情況下,gcc 5.x和gcc 4.x都告訴'make VERBOSE = 1?在兩種情況下,實際上有不同的gcc使用?由於cmake緩存CXX_COMPILER值和正在運行的腳本(Cmakelists.txt)時間,您無法更改編譯器 – fghj
「如果您獲取有關涉及std :: __ cxx11命名空間或標記[abi:cxx11中的類型的符號的未定義引用的鏈接器錯誤]那麼它可能表明你正試圖鏈接使用_GLIBCXX_USE_CXX11_ABI宏的不同值編譯的目標文件「https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html – Ben
我在構建中刪除了evrything存儲庫,以避免任何緩存問題 – Aleph