2017-02-21 4 views
1

У меня есть приложение C++ 14 с использованием std::regex. Для некоторых регулярных выражений конструктор std::regex будет вызывать std::bad_cast (через std::use_facet), если фасет сопоставления недоступен.Ссылка на библиотеку вызывает сопоставление фасет, отсутствующий в char

Я хочу связать свое приложение с сторонней библиотекой, распространяемой как .so, для которой у меня нет источника. Эта библиотека предоставляет версии символов по умолчанию для всего, что нужно от glibc. Указанная версия - 2.2.5 (выпущена в 2002 году). Например, nm говорит мне:

U [email protected]@GLIBC_2.2.5 

Если я связываю приложение без сторонней библиотеки, работают регулярные выражения. Но когда я связываюсь с сторонней библиотекой, std::has_facet<std::collate<char>>(std::locale()) возвращает false, поэтому конструктор std::regex выбрасывает.

Я полагаю, что очень старые версии символов, требуемые сторонней библиотекой, мешают языку по умолчанию. Я попытался изменить локаль по умолчанию из моего приложения, но это не помогает.

Как это исправить?

ответ

1

Обновление версии сторонней библиотеки, построенной с использованием нового компилятора, приводит к исчезновению проблемы.

0

Недавно я столкнулся с той же проблемой. В моем случае поведение произошло, потому что я использовал различные версии GCC для компиляции библиотеки и исполняемого файла. Вот мои результаты объединения GCC 4.7 и GCC 5.5 для компиляции библиотеки и исполняемого файла:

  • Library (GCC 4.7) + исполняемый файл (GCC 5.5) = Failure: упорядочивание пропавших
  • Library (GCC 4,7) + Исполняемые (GCC 4,7) = Успех: Разобрать доступный
  • Library (GCC 5,5) + исполняемый файл (GCC 5,5) = Успех : Разобрать доступны

Тест основан на проверку наличия полукокса подборки как

std::has_facet<std::collate<char>>(std::locale())