2017-02-21 4 views
1

std::regexを使用するC++ 14アプリケーションがあります。いくつかの正規表現では、コレートファセットが使用できない場合、std::regexコンストラクタはstd::bad_caststd::use_facet経由)をスローします。ライブラリとリンクすると、collat​​eファセットが文字から欠落する

ソースがない.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)=失敗::ここでは、ライブラリと実行可能ファイルをコンパイルする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()) 
のようにchar型のCOLLATEの可用性を確認するに基づいています
関連する問題