1. Reason:
GCC 5 will compile STD:: string as per C + + 11 STD::__cxx11::basic_string< char> At this time, if the library you call does not enable the C + + 11 feature during compilation, the STD:: string in it is actually STD:: basic_string< char>, If the string under c + + 11 is passed as a parameter into a library other than C + + 11, error: cannot convert ‘const STD::__cxx11::basic_string< char>’ To ‘const char *’, or undefined reference
Enter GCC installation directory and enter include/c++/5.4.0
Directory, and then view x86_64 unknown Linux GNU/bits/C + + config.H
, or key macro definitions in (/usr/include/x86_64 Linux GNU/C + +/5/bits/C + + config.H):
#if _GLIBCXX_USE_CXX11_ABI namespace std { inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } } namespace __gnu_cxx { inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } } # define _GLIBCXX_NAMESPACE_CXX11 __cxx11:: # define _GLIBCXX_BEGIN_NAMESPACE_CXX11 namespace __cxx11 { # define _GLIBCXX_END_NAMESPACE_CXX11 } # define _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_ABI_TAG_CXX11 #else # define _GLIBCXX_NAMESPACE_CXX11 # define _GLIBCXX_BEGIN_NAMESPACE_CXX11 # define _GLIBCXX_END_NAMESPACE_CXX11 # define _GLIBCXX_DEFAULT_ABI_TAG
Check bits/basic_string.h
#if _GLIBCXX_BEGIN_NAMESPACE_CXX11 // line 52~2441 _GLIBCXX_END_NAMESPACE_CXX11 #else // !_GLIBCXX_USE_CXX11_ABI // Reference-counted COW string implentation // ... #endif
That is, use the old version of GCC or – D_GLIBCXX_USE_CXX11_ABI = 0, STD:: string will use the old version of STD:: basic_string. However, when compiling with the new version of GCC, STD:: string will use STR::__cxx11::basic_string. Therefore, if the linked library uses different versions of GCC or the compilation options are different during compilation, the following errors will occur:
libboost_regex.so.1.72.0: undefined reference to `std::__cxx11::messages<char> const& std::use_facet<std::__cxx11::messages<char> >(std::locale const&)@GLIBCXX_3.4.21'
2. If string is not involved, you can simply use the library that implements code compilation by yourself. You can add cxx11 scope during compilation in the following ways:
# define DUAL_ABI cxx11 __attribute__((abi_tag("cxx11"))) namespace ClassA { inline namespace DUAL_ABI { // library goes here } }
This can solve problems like undefined reference to ` STD::_Cxx11:: funa() ` problem.
3. Otherwise, you can only use the corresponding compilation option or GCC version
4. View compile symbol commands
Strings view symbols and C + + filt explain symbols
strings libfuna.so | grep init #_ZN12TensorRT_SDK4initESsi c++filt _ZN12TensorRT_SDK4initESsi #TensorRT_SDK::init(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)
Similar Posts:
- [Solved] undefined reference to `cv::imread(std::string const&, int)’
- [Solved] Clang: error: linker command failed with exit code 1
- [Solved] Protobuf Error: ‘tr1/unordered_map’ file not found
- How to Solve Const variable assignment Error
- Hi3516DV300 Chip Error: “undefined reference to ×”
- undefined symbol: xxx – undefined reference to `typeinfo
- C++ error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘m…
- deprecated conversion from string constant to char*
- Undefined reference to ‘pthread’ appears in Linux Ubuntu running thread program_ Create ‘and undefined reference to’ pthread ‘_ ‘join’ error.
- Electronic error: Uncaught TypeError: Cannot read property ‘dialog’ of undefined