繁体   English   中英

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

[英]Getting locale functions to work in glibc

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

我已经从这里签出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

我也尝试过运行该程序,但是将语言环境变量设置为其他字符串,例如"en_US.UTF-16 ”, """en_US.UTF-8"等,都没有运气。

我想这不是我尝试使区域设置与我的修改版glibc一起使用时遇到的第一个问题,而是第一个问题。

关于如何使语言环境功能(特别是setlocale )正常工作的任何想法?

我的猜测:您忘记了“设置”某些语言环境。 尝试:

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

另请参见GNU libc make手册

安装后,您可能需要配置时区和语言环境安装…

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM