簡體   English   中英

將 std::__cxx11::string 轉換為 std::string

[英]Converting std::__cxx11::string to std::string

我使用的是c++11,但也有一些沒有為它配置的庫,需要一些類型轉換。 特別是我需要一種將std::__cxx11::string轉換為常規std::string ,但是谷歌搜索我找不到這樣做的方法並且將(string)放在前面不起作用。

如果我不轉換,我會收到這樣的鏈接器錯誤:

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'

您是否可能正在使用 GCC 5?

如果您收到有關未定義引用符號的鏈接器錯誤,這些符號涉及 std::__cxx11 命名空間或標記 [abi:cxx11] 中的類型,那么這可能表明您正在嘗試將使用 _GLIBCXX_USE_CXX11_ABI 的不同值編譯的目標文件鏈接在一起宏。 當鏈接到使用舊版 GCC 編譯的第三方庫時,通常會發生這種情況。 如果無法使用新 ABI 重建第三方庫,則需要使用舊 ABI 重新編譯代碼。

來源: GCC 5 發行說明/雙 ABI

包含任何標准庫頭文件之前定義以下宏應該可以解決您的問題: #define _GLIBCXX_USE_CXX11_ABI 0

如果您可以重新編譯您使用的所有不兼容的庫,請使用編譯器選項進行編譯

-D_GLIBCXX_USE_CXX11_ABI=1

然后重建你的項目。 如果你不能這樣做,添加到你的項目的 makefile 編譯器選項

-D_GLIBCXX_USE_CXX11_ABI=0

定義

#define _GLIBCXX_USE_CXX11_ABI 0/1

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

當我遇到類似問題時,這是因為我的 lib 是使用clang++構建的,並且默認情況下它在我的系統上鏈接到libstdc++.so 雖然應用程序二進制文件是使用clang構建並與-lc++選項鏈接的。

檢查依賴項的最簡單方法是執行ldd libName.so

要修復它,您應該在應用程序和庫中使用相同的庫。

  • 最簡單的方法。 使用clang++構建庫並使用clang++編譯應用clang++ 兩個步驟都沒有額外的鏈接選項。 將使用默認標准庫。

  • 使用-stdlib=c++構建庫並使用-lc++編譯應用-lc++ 在這種情況下,庫和應用程序都將使用libc++.so

  • 無需額外選項即可構建庫並將二進制文件鏈接到-lstdc++ 在這種情況下,庫和應用程序都將使用libstdc++.so

這里的答案主要集中在解決它的簡短方法上,但如果這沒有幫助,我會給出一些步驟來檢查,這對我有幫助(僅限 Linux):

  • 如果鏈接其他庫時發生鏈接器錯誤,請使用調試符號(“-g”GCC 標志)構建這些庫
  • 列出庫中的符號並 grep 鏈接器抱怨的符號(在命令行中輸入命令):

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • 如果您有方法簽名,請繼續下一步,如果您no symbols ,很可能您從庫中剝離了所有符號,這就是鏈接器在鏈接庫時找不到它們的原因。 重建庫而不剝離所有符號,如果需要,您可以剝離調試( strip -S選項)符號。

  • 使用c++ demangler來理解方法簽名,例如這個

  • 將您剛剛獲得的庫中的方法簽名與您在代碼中使用的方法簽名(也檢查頭文件)進行比較,如果它們不同,請使用正確的頭文件或正確的庫或您現在知道的任何其他方法來修復它

我明白了,我發現解決此問題的唯一方法是更新所有 mingw-64(我在 msys2 上使用 pacman 進行了此操作以供您參考)。

對我來說 -D_GLIBCXX_USE_CXX11_ABI=0 沒有幫助。

它在我鏈接到 C++ libs 版本而不是 gnustl 后工作。

我最近在嘗試與 Ubuntu 16.04 上的hdf5 版本 1.10.5的預構建二進制文件鏈接時遇到了類似的問題。 這里建議的所有解決方案都不適合我,我使用的是 g++ 9.1 版。 我發現最好的解決方案是從源代碼構建 hdf5 庫。 不要使用預先構建的二進制文件,因為它們是使用 gcc 4.9 構建的! 相反,從 hdf網站為您的特定發行版下載源代碼檔案並構建庫。 這很容易。

如果您的系統上還沒有壓縮庫zlibszip ,您還需要分別來自此處此處

就我而言,我遇到了類似的問題:

/usr/bin/ld: Bank.cpp:(.text+0x19c): undefined reference to 'Account::SetBank(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' collect2: error: ld returned 1 exit status

經過一些研究,我意識到問題是由 Visual Studio Code 編譯 Bank.cpp 文件的方式產生的。 所以,為了解決這個問題,我只是提示了以下命令以成功編譯 c++ 文件:

g++ Bank.cpp Account.cpp -o Bank

使用上面的命令,它能夠正確鏈接頭文件、實現文件和主 c++ 文件。

OBS:我的 g++ 版本:Ubuntu 20.04 上的 9.3.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM