2015-10-28 123 views
42

我使用C++ 11,但也有一些沒有爲它配置的庫,並且需要一些類型轉換。特別是我需要一種方法來將std::__cxx11::string轉換爲常規std::string,但是使用谷歌搜索我找不到方法來執行此操作,並將(string)放在前面不起作用。將std :: __ cxx11 :: string轉換爲std :: string

如果我不轉換,我得到的鏈接錯誤是這樣的:您正在使用GCC 5

undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const' 
+1

錯誤聽起來更像編譯器無法找到'insertMember()'方法。 –

+1

嗯,它可以找到它與我沒有使用'C++ 11' – jorgen

+0

其他程序其實它似乎是鏈接器,而不是編譯器。 「發現」是什麼意思,那些「其他程序」是什麼? –

回答

57

這可能嗎?

如果你得到關於未定義的引用鏈接錯誤,對涉及在STD類型的符號:: __ cxx11命名空間或標籤[ABI:cxx11]那麼它很可能表明你正在嘗試鏈接在一起對象進行編譯的文件對_GLIBCXX_USE_CXX11_ABI宏使用不同的值。鏈接到使用舊版GCC編譯的第三方庫時,通常會發生這種情況。如果第三方庫不能用新的ABI重建,那麼你將需要用舊的ABI重新編譯你的代碼。

來源:GCC 5 Release Notes/Dual ABI

定義下面的宏以前包括任何標準庫頭應該解決您的問題:#define _GLIBCXX_USE_CXX11_ABI 0

+1

我試過了;現在,我在使用C++ 11函數的任何地方都會遇到鏈接器錯誤。也許沒有辦法使用C++ 11和編譯後的hdf5庫來實現這個功能。 – jorgen

+0

對於我來說,在Ubuntu 14.04上,默認情況下,g ++ 6.2編譯時將該值設置爲0,而在16.04版中,g ++版本編譯時將其設置爲1.在14.04,將其設置爲1實際上並沒有做任何事情;生成的目標文件不使用CXX11 ABI。我懷疑這是一個系統限制。 –

+0

我不確定爲什麼編譯器會拋出'undefined reference',並且在尋找解決方案之前,我在程序中檢查了我的整個鏈接並且沒有找到任何東西。之後,我決定在網上搜索,發現這一點。它的作品像魅力,謝謝:) – Shravan40

29

如果你可以重新編譯您使用的所有不兼容庫,用編譯器選項的做法,

-D_GLIBCXX_USE_CXX11_ABI = 1

然後重建你的項目。如果你不能做到這一點,添加到您的項目的生成文件編譯器選項

-D_GLIBCXX_USE_CXX11_ABI = 0

的定義

的#define _GLIBCXX_USE_CXX11_ABI 0/1

也很好,但您可能需要將其添加到所有文件,而編譯器選項一次執行所有文件。

+1

編譯器標誌爲我工作。謝謝。我在gcc的這個愚蠢的改變浪費了4天! –

+0

謝謝。這個標誌也適用於我 – hbobenicio

0

我得到了這個,我發現解決這個問題的唯一方法是更新所有的mingw-64(我在msys2上使用pacman爲你提供了信息)。