让语言环境功能在glibc中工作

时间:2013-08-20 17:29:06

标签: c locale glibc libc strcmp

我需要对C标准库(glibc)进行一些修改才能获得一些性能改进。具体来说,我将编写一些与语言环境相关的函数的特殊版本(在glibc中表现不佳),例如strcoll

我已将here的glibc来源检出到~/Desktop/glibc。然后我运行了以下命令序列而没有错误。

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

此时,我已成功编译并将glibc安装到~/Desktop/bglibc。然后,我在bglibc目录中创建了以下测试程序(ct.c):

#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代码以运行其性能测试,然后将其调整为针对特定区域设置运行得更快。

我知道"en_US.utf8"是我系统的有效语言环境(Ubuntu 12.04 lts),因为我看到了这一点:

$ locale -a | grep US
en_US.utf8

我也试过运行这个程序,但是将locale变量设置为其他字符串,例如"en_US.UTF-16&#34;,"""en_US.UTF-8"等等都没有运气。< / p>

我想这不是我尝试使用我的修改版glibc来处理语言环境时遇到的第一个问题,但它是第一个问题。

任何想法我可以做些什么来使区域设置功能(特别是setlocale)正常工作?

2 个答案:

答案 0 :(得分:1)

我的猜测:你忘了“制作”一些地方。尝试:

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

另见GNU libc make manual

  

安装后,您可能需要配置时区和区域设置   安装...

答案 1 :(得分:0)

尝试使用strace找出glibc尝试从哪里读取语言环境。我怀疑,因为你设置了前缀glibc尝试在~/Desktop/bglibc/share/locale/或类似的东西中找到它们。当然UTF-16不适用于8位字符串类型...