developer tip

std :: __ cxx11 :: string을 std :: string으로 변환

copycodes 2020. 11. 17. 08:20
반응형

std :: __ cxx11 :: string을 std :: string으로 변환


저는 C ++ 11을 사용하지만 이에 맞게 구성되지 않은 일부 라이브러리도 사용하며 형식 변환이 필요합니다. 특히 std::__cxx11::stringregular 로 변환하는 방법이 필요 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++. 두 단계에서 추가 연결 옵션이 없습니다. 기본 stdlib가 사용됩니다.

  • 를 사용 -stdlib=c++하여 라이브러리를 빌드 하고 -lc++. 이 경우 라이브러리와 앱 모두 libc++.so.

  • 추가 옵션없이 라이브러리를 빌드하고 바이너리를 -lstdc++. 이 경우 라이브러리와 앱 모두 libstdc++.so.


여기의 답변은 대부분 문제를 해결하는 짧은 방법에 초점을 맞추고 있지만 도움이되지 않는 경우 몇 가지 확인 단계를 제공하여 도움이되었습니다 (Linux 만 해당).

  • 다른 라이브러리를 연결할 때 링커 오류가 발생하면 디버그 기호 ( "-g"GCC 플래그)를 사용하여 해당 라이브러리를 빌드합니다.
  • 라이브러리의 심볼을 나열하고 링커가 불평하는 심볼을 grep합니다 (명령 줄에 명령 입력).

    nm lib_your_problem_library.a | grep functionNameLinkerComplainsAbout

  • 메서드 서명이있는 경우 다음 단계로 진행합니다. no symbols대신받은 경우 라이브러리에서 모든 심볼을 제거했을 가능성이 높으므로 링커가 라이브러리를 연결할 때 심볼을 찾을 수 없습니다. 모든 기호를 제거하지 않고 라이브러리를 다시 빌드합니다 strip -S. 필요한 경우 디버그 ( 옵션) 기호를 제거 할 수 있습니다 .

  • 예를 들어, 메소드 서명을 이해 ++ demangler는 C를 사용하여 이 일

  • 방금 얻은 라이브러리의 메서드 서명과 코드에서 사용중인 메서드 (헤더 파일도 확인)를 비교하고, 다른 경우 적절한 헤더 또는 적절한 라이브러리를 사용하거나 현재 알고있는 다른 방법으로 수정합니다.

이 문제를 해결하기 위해 찾은 유일한 방법은 모든 mingw-64를 업데이트하는 것입니다 (정보를 위해 msys2에서 pacman을 사용하여이 작업을 수행했습니다).


나를 위해 -D_GLIBCXX_USE_CXX11_ABI = 0은 도움이되지 않았습니다.

gnustl 대신 C ++ libs 버전에 링크 한 후에 작동합니다.

참고 URL : https://stackoverflow.com/questions/33394934/converting-std-cxx11string-to-stdstring

반응형