std :: __ cxx11 :: string을 std :: string으로 변환
저는 C ++ 11을 사용하지만 이에 맞게 구성되지 않은 일부 라이브러리도 사용하며 형식 변환이 필요합니다. 특히 std::__cxx11::string
regular 로 변환하는 방법이 필요 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로 코드를 다시 컴파일해야합니다.
표준 라이브러리 헤더 를 포함 하기 전에 다음 매크로 를 정의하면 문제가 해결됩니다.#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
'developer tip' 카테고리의 다른 글
Fragment 내에서 ViewPager 탭 변경 감지 (0) | 2020.11.17 |
---|---|
Android : 2MB 여유 힙이있는 400KB 파일의 BitmapFactory.decodeStream () 메모리 부족 (0) | 2020.11.17 |
Visual Studio에서 푸시되지 않은 나가는 커밋을 제거하는 방법은 무엇입니까? (0) | 2020.11.17 |
Capistrano에서 Git 하위 디렉터리 배포 (0) | 2020.11.17 |
드롭 다운 목록 제어 (0) | 2020.11.17 |