1

パフォーマンスを向上させるために、C 標準ライブラリ (glibc) にいくつかの変更を加える必要があります。具体的には、strcoll.

glibc ソースをhereから にチェックアウトしました~/Desktop/glibc。次に、次の一連のコマンドをエラーなしで実行しました。

$ cd ~/Desktop
$ mkdir bglibc
$ cd bglibc
$ ./../glibc/configure --prefix=~/Desktop/bglibc
$ make
$ make install

この時点で、glibc のコンパイルとインストールに成功しました~/Desktop/bglibcct.c次に、bglibc ディレクトリに次のテスト プログラム ( ) を作成しました。

#include <stdio.h>
#include <locale.h>

int main ()
{
  char *locale = NULL;
  locale = "en_US.utf8";

  char *result = setlocale(LC_COLLATE, locale);
  if (result == NULL) {
    printf("locale not set\n");
  }   

  printf("strcoll: %d\n", strcoll("some", "string"));

  return 0;
}

次に、次のスクリプトでビルドします。

iSYSROOT=~/Desktop/bglibc

gcc -o ct ct.c \
  --sysroot=${SYSROOT} \
  -Wl,-rpath=${SYSROOT}/lib \
  -Wl,--dynamic-linker=${SYSROOT}/lib/ld.so.1

それを適切に構築します。次に、次のスクリプトで実行します。

#!/bin/sh
builddir=`dirname "$0"`
GCONV_PATH="${builddir}/iconvdata" \
exec    "${builddir}"/elf/ld-linux-x86-64.so.2 --library-path "${builddir}":"${builddir}"/*:"${builddir}"/*/*:"${builddir}"/*/*/* ${1+"$@"}

これは名前testrun.shです。以前にコンパイルしたプログラム ( ct) で実行するには、 を実行し./testrun.sh ./ctます。

これによりプログラムは正常に実行されますが、プログラムは を出力します。locale not setこれは、ロケールを に設定できなかったことを意味します"en_US.utf8"。したがって、ロケールはデフォルトの ( "C") を保持します。この場合strcoll、単純に の結果を返しますstrcmp。ただし、strcollパフォーマンスのテストを実行するためにコードを実行し、特定のロケールでより高速に実行するように調整するには、この呼び出しが必要です。

これが私のシステム(Ubuntu 12.04 lts)の有効なロケールであることはわかってい"en_US.utf8"ます。

$ locale -a | grep US
en_US.utf8

私もこのプログラムを実行しようとしましたが、ロケール変数を"en_US.UTF-16" ""、、、などの他の文字列に設定しましたが"en_US.UTF-8"、うまくいきませんでした。

これは、変更されたバージョンの glibc でロケール関連のものを動作させようとするときに遭遇する最初の問題ではないと思いますが、最初の問題です。

setlocaleロケール機能(具体的には)を正しく機能させるために何ができるかについてのアイデアはありますか?

4

2 に答える 2

1

私の推測では、いくつかのロケールを「作成」するのを忘れていました。試す:

$ make
$ make install
$ make localedata/install-locales

GNU libc make マニュアルも参照してください

インストール後、タイムゾーンとロケールのインストールを構成したい場合があります…

于 2014-05-11T18:46:47.220 に答える