2017-02-21 1 views
1

Ich habe eine C++ 14 Anwendung mit std::regex. Bei einigen regulären Ausdrücken wird der std::regex-Konstruktor std::bad_cast (über std::use_facet) werfen, wenn die Sortierfacette nicht verfügbar ist.Verlinkung mit Bibliothek verursacht Kollation Facette fehlen von Char

Ich möchte meine Anwendung mit einer Bibliothek von Drittanbietern verbinden, die als .so vertrieben wird, für die ich keine Quelle habe. Diese Bibliothek bietet Standard-Symbol-Versionen für alles, was sie von glibc benötigt. Die angegebene Version ist 2.2.5 (veröffentlicht im Jahr 2002). Zum Beispiel nm sagt mir:

U [email protected]@GLIBC_2.2.5 

Wenn ich meine Anwendung verknüpfen, ohne die Drittanbieter-Bibliothek arbeiten reguläre Ausdrücke. Aber wenn ich mit der Drittanbieter-Bibliothek verknüpfen, gibt std::has_facet<std::collate<char>>(std::locale()) false zurück, so dass der std::regex Konstruktor wirft.

Meine Vermutung ist, dass die sehr alten Symbolversionen, die von der Drittanbieterbibliothek gewünscht werden, das Standardgebietsschema stören. Ich habe versucht, das Standardgebietsschema in meiner Anwendung zu ändern, aber das hilft nicht.

Wie kann ich das beheben?

Antwort

1

Das Aktualisieren auf eine Version der Third-Party-Bibliothek, die mit einem neueren Compiler erstellt wurde, führt dazu, dass das Problem verschwindet.

0

Ich lief vor kurzem in das gleiche Problem. In meinem Fall trat das Verhalten auf, weil ich verschiedene Versionen von GCC verwendete, um Bibliothek und ausführbares zu kompilieren. Hier sind meine Ergebnisse von 5,5 GCC 4.7 und GCC Kombination Bibliothek und ausführbare Datei zu kompilieren:

  • Library (GCC 4.7) + Executable (GCC 5.5) = Fehler: collate fehlt
  • Library (GCC 4.7) + Executable (GCC 4,7) = Erfolg: Collate verfügbar
  • Library (GCC 5.5) + Executable (GCC 5,5) = Erfolg Collate verfügbar

Der Test basiert auf Überprüfung der Verfügbarkeit des char collate wie

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