![](/img/trans.png)
[英](std::__cxx11::string) [with T = std::__cxx11::basic_string<char>; std::__cxx11::string = std::__cxx11::basic_string<char>] cannot be overloaded
[英]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):
列出庫中的符號並 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 后工作。
就我而言,我遇到了類似的問題:
/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.