2017-02-21 7 views
1

std::regex을 사용하는 C++ 14 응용 프로그램이 있습니다. 일부 정규식의 경우 콜레이트면을 사용할 수없는 경우 std::regex 생성자는 std::bad_cast (std::use_facet을 통해)을 전달합니다.라이브러리와 연결하면 콜레이트 패싯이 문자에서 누락됩니다.

내 응용 프로그램을 소스가없는 .so로 배포 된 타사 라이브러리와 연결하려고합니다. 이 라이브러리는 glibc에서 필요한 모든 것을 기본 심볼 버전으로 제공합니다. 버전이 지정하는 버전은 2.2.5입니다 (2002 년에 릴리스 됨). 예를 들어, nm은 다음과 같이 알려줍니다.

U [email protected]@GLIBC_2.2.5 

제 3 자 라이브러리없이 응용 프로그램을 연결하면 정규 표현식이 작동합니다. 그러나 제 3 자 라이브러리와 연결하면 std::has_facet<std::collate<char>>(std::locale())이 false를 반환하므로 std::regex 생성자가 throw합니다.

제 생각 엔 제 3 자 라이브러리가 원했던 아주 오래된 기호 버전이 기본 로케일을 방해하고있는 것 같습니다. 내 응용 프로그램 내에서 기본 로케일을 변경하려고 시도했지만 도움이되지 않습니다.

어떻게 해결할 수 있습니까?

답변

1

최신 컴파일러로 빌드 된 타사 라이브러리 버전으로 업데이트하면 문제가 사라집니다.

0

최근에 같은 문제가 발생했습니다. 제 경우에는 동작이 발생했습니다. 다른 버전의 GCC을 사용하여 라이브러리와 실행 파일을 컴파일했기 때문입니다.

  • 라이브러리 (GCC 4.7) + 실행 (GCC 5.5) = 실패 : 다음은 라이브러리와 실행 파일을 컴파일하기 위해 GCC 4.7과 GCC 5.5을 결합 내 결과입니다
  • 도서관 누락 한 부씩 인쇄 (GCC 4.7) + 실행 (GCC 4.7) = 성공 : 사용할 수
  • 라이브러리를 한 부씩 인쇄 (GCC 5.5) + 실행 (GCC 5.5) = 성공 : 가능한 한 부씩 인쇄
  • 시험은 숯불에 한 부씩의 가용성과 같은

    std::has_facet<std::collate<char>>(std::locale()) 
    
    확인을 기반으로