| lixiaosi 回复于:2003-11-17 17:59:55
|
没人会吗?
|
| gadfly 回复于:2003-11-17 22:20:24
|
gettext是GNU的软件包,你可以到sunfreeware.com上去下载二进制软件包安装。
/usr/local应该是缺省的路径,带不带都无所谓的。
你上个帖子我回了呀,给了两个链接,应该有安装和使用说明吧?
|
| lixiaosi 回复于:2003-11-18 09:40:03
|
gadfly版主,最后问一个完全安装的问题,我依照GNU提供的文档,分析
完全安装的步骤如下:
1.
#ls
libiconv-1.9.1.tar.gz
gettext-0.12.1.tar.gz
#tar -zxvf libiconv-1.9.1.tar.gz
#tar -zxvf gettext-0.12.1.tar.gz
#cd libiconv-1.9.1
#./configure --prefix=/usr/local
#make
#make install
2.
#cd gettext-0.12.1
#ls
gettext-0.12.1
#./configure --prefix=/usr/local
#make
#make install
3.
#cd libiconv-1.9.1
#ls
libiconv-1.9.1
#make distclean
#./configure --prefix=/usr/local
#make
#make install
上面的完全安装步骤对否?
|
| lixiaosi 回复于:2003-11-18 11:20:19
|
我按照上面的方法安装,没有成功,报错如下:
# make install
builddir="`pwd`"; cd libcharset && make all && make install-lib libdir="$builddi
r/lib" includedir="$builddir/lib"
make[1]: Entering directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset'
cd lib && make all
make[2]: Entering directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset/lib'
/bin/sh ../libtool --mode=link gcc -o libcharset.la -rpath /usr/local/lib -vers
ion-info 1:0:0 -no-undefined localcharset.lo relocatable.lo
rm -fr .libs/libcharset.so .libs/libcharset.so.1 .libs/libcharset.so.1.0.0
gcc -shared -Wl,-h -Wl,libcharset.so.1 -o .libs/libcharset.so.1.0.0 .libs/local
charset.o .libs/relocatable.o -lc
(cd .libs && rm -f libcharset.so.1 && ln -s libcharset.so.1.0.0 libcharset.so.1)
(cd .libs && rm -f libcharset.so && ln -s libcharset.so.1.0.0 libcharset.so)
false cru .libs/libcharset.a localcharset.o relocatable.o
make[2]: *** [libcharset.la] Error 1
make[2]: Leaving directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset/lib'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset'
make: *** [lib/localcharset.h] Error 2
这是为啥,怎样才能安装成功?
|
| lixiaosi 回复于:2003-11-18 16:32:06
|
我看源码编译不成功,就从www.sunfreeware.com
上面下载了gettext-0.11.5-sol9-sparc-local.gz和
libiconv-1.8-sol9-sparc-local.gz安装上,还是报以前
的错:
iconv_open():: Invalid argument
我真得很无奈呀,谁能帮一把??
|
| gadfly 回复于:2003-11-18 16:43:20
|
sorry,上次回的不是你发的贴子。
呵呵,问题几乎一样。我以为是你问过的。
http://chinaunix.net/forum/viewtopic.php?t=200502
你可以问问heartk,看她解决没有。
缺省的也许是不行。
我用源码安装试试看。试完再告诉你结果
|
| lixiaosi 回复于:2003-11-18 16:51:10
|
好
先谢谢了!
|
| gadfly 回复于:2003-11-18 17:40:18
|
我装了一下,应该问题不大了。
方法,如下。
1、从sunfreeware分别下载gettext和libiconv
注意,是二进制的安装包,而不是源码包
2、gunzip 这两个软件包,然后
pkgadd -d gettext*
pkgadd -d libiconv*
3、export PATH=/usr/local/bin:$PATH
这个目的是用来用gnu的iconv代替solaris自带的iconv
这样你就可以测试了。
$ iconv -l|grep -i UTF
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7
$ iconv -l|grep -i unicode
ISO-10646-UCS-2 UCS-2 CSUNICODE
UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11
UCS-2LE UNICODELITTLE
UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7
你会发现这个iconv是支持utf-16的。我记得unicode指的就是utf-16
所以命令行测试,你就可以用
$iconv -f gb2312 -t utf-16 your_data_file
相比solaris自带的
/usr/bin/iconv -f gb2312 -t utf-16 test_conv.c
就报错。
注意上面不要在步骤4之后测试,否则用的库是gnu的,就不会报错了。
4、export LD_PRELOAD=/usr/local/lib/libiconv_plug.so
这个目的就是用来替换libc的缺省iconv库函数的
所以你测试源码中这样写
iconv_open("utf-16", "gb2312");
or
iconv_open("gb2312", "utf-16");
编译的时候需要带-liconv
|
| lixiaosi 回复于:2003-11-18 18:06:27
|
高人呀,我按照你说的一步步做下来
就没有问题了
厉害厉害!
困扰我一星期问题终于解决了
我都不知道说啥好了
还是要说谢谢谢谢谢!
祝好运!!
|
| gadfly 回复于:2003-11-18 18:29:32
|
呵呵,到北京请我吃饭好了。
经常有人问iconv相关的问题,有时间整理个相关的帖子。
现设为精彩,以备后查吧。
|
| lixiaosi 回复于:2003-11-19 09:29:07
|
行,没问题
呵呵
|
| lixiaosi 回复于:2003-11-19 11:14:18
|
gadfly,又出现问题了,我在我的环境里面加上这个:
LD_PRELOAD=/usr/local/lib/libiconv_plug.so;export LD_PRELOAD
然后在环境里面就有了LD_PRELOAD=/usr/local/lib/libiconv_plug.so
然后我查看用户进程,就这样:
$ ps
ld.so.1: ps: fatal: /usr/local/lib/libiconv_plug.so: wrong ELF class: ELFCLASS32
Killed
$
$ ps -ef|grep hhf
ld.so.1: ps: fatal: /usr/local/lib/libiconv_plug.so: wrong ELF class: ELFCLASS32
$
然后我把环境里面的这个一行LD_PRELOAD=/usr/local/lib/libiconv_plug.so;export LD_PRELOAD
屏蔽了,查看进程就好了,是不是哪里有问题?我屏壁掉这一行以后,
继续运行我有关UTF-16和gb2312转换的程序,依旧是没问题?这是为何?
|
| lixiaosi 回复于:2003-11-19 14:44:08
|
$ sqlplus sys/sys
SQL*Plus: Release 8.1.7.0.0 - Production on Wed Nov 19 14:07:30 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
ld.so.1: oraclekgl: warning: /usr/local/lib/libiconv_plug.so: open failed: illeg
al insecure pathname
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.0.0 - 64bit Production
$ su root
ld.so.1: su: warning: /usr/local/lib/libiconv_plug.so: open failed: illegal inse
cure pathname
Password:
#
一旦把LD_PRELOAD=/usr/local/lib/libiconv_plug.so加在环境中,就出现这样的警告,这是为何??
|
| lixiaosi 回复于:2003-11-19 16:56:05
|
gadfly,是不是我在安装
pkgadd -d gettext*
pkgadd -d libiconv*
这两个包的时候我用的是root用户
而我的执行程序的用户使hhf,是不是该用
hhf用户来安装这两个包??
|
| lixiaosi 回复于:2003-11-19 17:12:00
|
应该不是,我把
LD_PRELOAD=/usr/local/lib/libiconv_plug.so;export LD_PRELOAD
加在root用户的环境变量里面,一样出现上面的错
这就奇怪了
|
| gadfly 回复于:2003-11-19 20:37:07
|
两个办法:
1、按上面的方法重新编译后,运行
ldd your_program
你看看有没有
libiconv.so.2 => /usr/local/lib/libiconv.so.2
这样的字样。
如果有,以后运行your_program就没必要export这个环境变量了。
2、如果没有
你就做个启动脚本,wrapper your_program。
脚本中,执行你的程序之前export这个环境变量,执行后,unset这个环境变量,这样就不会有问题了。
|
| lixiaosi 回复于:2003-11-20 11:18:08
|
我按照你说的,做了一下,
1。 我没有在环境中加LD_PRELOAD=/usr/local/lib/libiconv_plug.so
然后做了一下
$ ldd send
libsocket.so.1 => /usr/lib/libsocket.so.1
libnsl.so.1 => /usr/lib/libnsl.so.1
libiconv.so.2 => /usr/local/lib/libiconv.so.2
libc.so.1 => /usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1
libmp.so.2 => /usr/lib/libmp.so.2
/usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1
$
显示有
libiconv.so.2 => /usr/local/lib/libiconv.so.2
这样的话就没有必要加LD_PRELOAD=/usr/local/lib/libiconv_plug.so
这个了,是吧,呵呵
2。这个脚本shell很简单,会写,呵呵,只是已经有上面的了,就不必写这个shell了
呵呵,谢谢gadfly
libiconv_plug.so和libiconv.so.2,这两个库有啥必然的联系?不明白
为啥已经在环境中了?
|
| lixiaosi 回复于:2003-11-20 13:15:06
|
我现在对引用的头文件又出现了疑问,我在头文件里面这样写:
#include <iconv.h>
和
#include "/usr/local/include/iconv.h"
这两种写法编译出的程序是一样的,执行都没有问题
然后我这样$ldd server,都能显示libiconv.so.2 => /usr/local/lib/libiconv.so.2
我就有点不明白的是:
#include <iconv.h>引用的永远都是/usr/include下的
头文件,那为何用这个头文件编译出的程序还是能用呢??
|
| gadfly 回复于:2003-11-20 20:48:39
|
1、头文件只是编译的时候需要的,和运行没有关系,所以只要不同库函数的接口一样,头文件用哪一个无所谓的。
2、程序如果运行中,会先调用LD_PRELOAD指定的动态库中的函数(如果有的话)会,而不会用缺省的链接指定的动态库中的函数。
既然你的程序已经指定的是这个动态库,就不用这个环境变量指定了。
我估计这两个动态库是一样的东西。
如果指定这个环境变量,同样会影响其它的程序,如果接口上有所不同,或
有系统安全检查的话,就会报错或发出警告。所以如果要用,就尽量减少影响范围。
|
| 非常开心 回复于:2003-11-21 11:38:13
|
libiconv只能调用一次?×××
|
| lixiaosi 回复于:2003-11-21 18:00:52
|
谢谢谢谢!
彻底的解决了
呵呵!
|