让区域设置函数在glibc中工作

让区域设置函数在glibc中工作,c,locale,glibc,libc,strcmp,C,Locale,Glibc,Libc,Strcmp,我需要对C标准库(glibc)进行一些修改,以获得一些性能改进。具体地说,我将编写一些与区域设置相关的函数的专门版本(在glibc中执行得很差),例如strcoll 我已将glibc源代码从签出到~/Desktop/glibc。然后,我毫无错误地运行了以下命令序列 $ cd ~/Desktop $ mkdir bglibc $ cd bglibc $ ./../glibc/configure --prefix=~/Desktop/bglibc $ make $ make install 现在,

我需要对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+"$@"}
这是names
testrun.sh
。要在我以前编译的程序(
ct
)上运行它,我运行
/testrun.sh./ct

这成功地运行了程序,但是程序打印出
locale not set
,这意味着无法将locale设置为
“en_US.utf8”
。因此,区域设置保留默认值(
“C”
),在这种情况下,
strcoll
只返回
strcmp
的结果。但是,我需要这个调用来运行strcoll代码,以便对其性能进行测试,然后对其进行调优,使其在特定地区运行得更快

我知道
“en_US.utf8”
是我的系统(Ubuntu12.04 lts)的有效语言环境,因为我看到:

$ locale -a | grep US
en_US.utf8
我也试过运行这个程序,但将locale变量设置为其他字符串,如
“en_US.UTF-16
”、
”、
“en_US.UTF-8”
,等等,都没有运气

我想这不是我在尝试使用我修改过的glibc版本时遇到的第一个问题,而是第一个问题


关于如何使语言环境函数(特别是
setlocale
)正常工作,我有什么想法吗?

尝试使用
strace
找出glibc试图从何处读取语言环境。我怀疑,由于您设置了前缀glibc,因此glibc试图在
~/Desktop/bglibc/share/locale/
或类似内容中找到它们。当然,UTF-16不能用于8位字符串类型…

尝试使用
strace
找出glibc试图从何处读取区域设置。我怀疑,由于您设置了前缀glibc,因此glibc试图在
~/Desktop/bglibc/share/locale/
或类似内容中找到它们。当然,UTF-16不能用于8位字符串类型…

我猜:您忘记了“创建”一些区域设置。尝试:

$ make
$ make install
$ make localedata/install-locales
另见

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

我猜:你忘了“制作”一些区域设置。尝试:

$ make
$ make install
$ make localedata/install-locales
另见

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


谢谢你的建议。我使用strace查看了一些系统调用,有一些与区域设置相关的调用是这样的:open(“/home/username/Desktop/bglibc/lib/locale/en_US.utf8/LC_IDENTIFICATION”,O_RDONLY | O_CLOEXEC)=-1 enoint(没有这样的文件或目录)。因此,它在不存在语言环境文件的地方(bglib/lib甚至不存在)查找语言环境文件。我环顾四周,似乎它们实际上位于以下目录中:bglibc/share/i18n/locales。为什么它会出现在错误的位置?它似乎应该知道正确的查找位置。我不知道,无论如何,一个简单的符号链接现在就足以测试当指向正确的目录时区域设置是否工作。我已将符号链接添加到正确的文件中,但问题仍然存在。我不知道你是否还有其他建议,但不管怎样,谢谢你的帮助。谢谢你的建议。我使用strace查看了一些系统调用,有一些与区域设置相关的调用是这样的:open(“/home/username/Desktop/bglibc/lib/locale/en_US.utf8/LC_IDENTIFICATION”,O_RDONLY | O_CLOEXEC)=-1 enoint(没有这样的文件或目录)。因此,它在不存在语言环境文件的地方(bglib/lib甚至不存在)查找语言环境文件。我环顾四周,似乎它们实际上位于以下目录中:bglibc/share/i18n/locales。为什么它会出现在错误的位置?它似乎应该知道正确的查找位置。我不知道,无论如何,一个简单的符号链接现在就足以测试当指向正确的目录时区域设置是否工作。我已将符号链接添加到正确的文件中,但问题仍然存在。我不知道你是否还有其他建议,但不管怎样,谢谢你的帮助。你尝试过setLocale(LC_ALL,locale)吗?也许这个链接会有所帮助:@Clocks,是的,我尝试过用LC_ALL代替,但没有用。就链接而言,这主要是解释“locale和setlocale是如何工作的”。我理解setlocale函数和系统语言环境如何工作得相当好,目前的问题有点复杂。不过谢谢。对我来说,来自用户2898218的答案很有效。考虑评论或接受他的回答。你试过StestLaLaLL(LCYALL,LARALE)吗?也许这个链接会有帮助:@时钟,是的,我试过使用LCYALALL,但它不起作用。就链接而言,这主要是解释“locale和setlocale是如何工作的”。我理解setlocale函数和系统语言环境如何工作得相当好,目前的问题有点复杂。不过谢谢。对我来说,来自用户2898218的答案很有效。考虑评论或接受他的回答。