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 |
谢谢谢谢!
彻底的解决了 呵呵! |