免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8868 | 回复: 16
打印 上一主题 下一主题

iconv库如何裁剪 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-18 10:15 |只看该作者 |倒序浏览
10可用积分
请教一下,如何裁剪iconv库,我现在只需要utf-8,gb2312。如果是全编译该库的话,我的flash不够用了!    急急急...............................

最佳答案

查看完整内容

不是太好搞。你需要裁出iconv_t结构,以及至少open/iconv等几个基本初始化函数,然后拷贝出utf8.c以及你要的gtk。期间依赖我没看。附件是我自己用的最新Iconv完整编译版本,vs2010 amd64,编译参数等自己看config.h和相关文件。压缩包里面的源码也是我提取出来的,你可以在那个基础上裁剪。不过这样应该挺好裁的。

论坛徽章:
0
2 [报告]
发表于 2012-04-18 10:15 |只看该作者
不是太好搞。你需要裁出iconv_t结构,以及至少open/iconv等几个基本初始化函数,然后拷贝出utf8.c以及你要的gtk。期间依赖我没看。

附件是我自己用的最新Iconv完整编译版本,vs2010 amd64,编译参数等自己看config.h和相关文件。
压缩包里面的源码也是我提取出来的,你可以在那个基础上裁剪。

不过这样应该挺好裁的。

iconv.zip

2.55 MB, 下载次数: 143

论坛徽章:
0
3 [报告]
发表于 2012-04-18 18:01 |只看该作者
src目录是完整源码,可以你自己去编译或者裁剪。include是头文件,lib是动静态库,你自己看着办

论坛徽章:
0
4 [报告]
发表于 2012-04-18 23:23 |只看该作者
呵呵。。。。。。。。。。这东西改的人很少,确实只能靠自己了。回复 3# walleeee


   

论坛徽章:
0
5 [报告]
发表于 2012-04-18 23:25 |只看该作者
        编译libiconv库之后,发现库文件有1M多,经过压缩之后还是有600~700K,对于flash很小的嵌入式系统来说,简直就是致命的,而且该库中的很多编码方式并不是我们所需要的。如果自己重新写编码转换的话,又很耗时间。个人认为裁减libiconv库是一个不错的选择,google了一下,发现根本没有关于裁减这个库的资料。所以,尝试着作了裁减。以下是我操作的相关步骤,供有需要的朋友参考。

1、从官网上下载libiconv库,最新版本下载的链接地址:http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

2、解压下载的库文件
# tar -xzvf libiconv-1.14.tar.gz

3、修改相应的三个文件(converters.h,encodings.def,aliases.h)即可,都位于libiconv-1.14/lib目录下,以下以删减iso2022_kr编码库为例:
        a.去除converters.h中定义的头文件
        #if 0
        #include "iso2022_kr.h"
        #endif
       
        在终端执行./configure & make,出现以下错误:
        make[1]: Entering directory `/root/example/libiconv-1.14/lib'
/bin/sh ../libtool --mode=compile gcc -I. -I. -I../include -I./../include -I.. -I./..  -g -O2 -fvisibility=hidden -DLIBDIR=\"/usr/local/lib\" -DBUILDING_LIBICONV -DBUILDING_DLL -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"/usr/local/lib\" -DNO_XMALLOC -Dset_relocation_prefix=libiconv_set_relocation_prefix -Drelocate=libiconv_relocate -DHAVE_CONFIG_H -c ./iconv.c
libtool: compile:  gcc -I. -I. -I../include -I./../include -I.. -I./.. -g -O2 -fvisibility=hidden -DLIBDIR=\"/usr/local/lib\" -DBUILDING_LIBICONV -DBUILDING_DLL -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"/usr/local/lib\" -DNO_XMALLOC -Dset_relocation_prefix=libiconv_set_relocation_prefix -Drelocate=libiconv_relocate -DHAVE_CONFIG_H -c ./iconv.c  -fPIC -DPIC -o .libs/iconv.o
In file included from ./iconv.c:112:
./encodings.def:1024: error: 'iso2022_kr_mbtowc' undeclared here (not in a function)
./encodings.def:1024: error: 'iso2022_kr_wctomb' undeclared here (not in a function)
./encodings.def:1024: error: 'iso2022_kr_reset' undeclared here (not in a function)
make[1]: *** [iconv.lo] Error 1
make[1]: Leaving directory `/root/example/libiconv-1.14/lib'

        b.接着修改encodings.def文件,屏蔽该文件中的以下内容
        #if 0
        DEFENCODING(( "ISO-2022-KR",            /* IANA, RFC 1557 */
                          "csISO2022KR",            /* IANA */
                        /*"ISO2022KR",                 JDK 1.1 */
                        ),
                        iso2022_kr,
                        { iso2022_kr_mbtowc, NULL },  { iso2022_kr_wctomb, iso2022_kr_reset })
        #endif

        在终端中继续执行make,看看又有什么错误会出现。
        cd lib && make all
make[1]: Entering directory `/root/example/libiconv-1.14/lib'
/bin/sh ../libtool --mode=compile gcc -I. -I. -I../include -I./../include -I.. -I./..  -g -O2 -fvisibility=hidden -DLIBDIR=\"/usr/local/lib\" -DBUILDING_LIBICONV -DBUILDING_DLL -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"/usr/local/lib\" -DNO_XMALLOC -Dset_relocation_prefix=libiconv_set_relocation_prefix -Drelocate=libiconv_relocate -DHAVE_CONFIG_H -c ./iconv.c
libtool: compile:  gcc -I. -I. -I../include -I./../include -I.. -I./.. -g -O2 -fvisibility=hidden -DLIBDIR=\"/usr/local/lib\" -DBUILDING_LIBICONV -DBUILDING_DLL -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"/usr/local/lib\" -DNO_XMALLOC -Dset_relocation_prefix=libiconv_set_relocation_prefix -Drelocate=libiconv_relocate -DHAVE_CONFIG_H -c ./iconv.c  -fPIC -DPIC -o .libs/iconv.o
In file included from ./iconv.c:154:
lib/aliases.gperf:356: error: 'ei_iso2022_kr' undeclared here (not in a function)
make[1]: *** [iconv.lo] Error 1
make[1]: Leaving directory `/root/example/libiconv-1.14/lib'

        c.最后,修改aliases.h文件(这步比较关键,如果不细心的话,可能在实际应用的时候会找不到你所需要的编码,造成不必要的麻烦)。在该文件中,找到有ei_iso2022_kr的地方,作如下修改:
        #if 0
        #line 355 "lib/aliases.gperf"
                {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_iso2022_kr},
        #else
                {-1},
        #endif

        #if 0
        #line 356 "lib/aliases.gperf"
                {(int)(long)&((struct stringpool_t *)0)->stringpool_str334, ei_iso2022_kr},
        #else
                {-1},
        #endif

        再一次make的时候,可以发现没有其它任何的错误。

4、经过裁减后,库可以成功编译出来了,但整体的编译可能还是存在一些问题,原因是你删除了相关的编码方式,而那些程序恰好使用到了它。以下是我遇到的一个问题的解决方法:
        问题:make进入libiconv-1.14/src目录不能编译。
        解决方法:不编译此目录。由于这里面的Makefile是根据Makefile.in文件生成的,所以直接修改Makefile.in
        屏蔽以下两句
        all : iconv_no_i18n$(EXEEXT) iconv.@OBJEXT@ $(OBJECTS_RES_@WOE32@)
        test `ls -ld . | sed -e 's/^d\(.........\).*/\1/'` = rwxrwxrwx || chmod 777 .
        新增
        all:

        如果只是删减一个的话,看不出有什么太大的变化,可以删除多个试试!



自己回了,有兴趣的朋友可以交流交流。                                            不知道这个分,怎么自己拿回来?

论坛徽章:
0
6 [报告]
发表于 2012-04-18 23:26 |只看该作者
回复 4# txgc_wm


如果仅仅是你要的utf8和gbk这个还好,就2个功能点,应该不复杂。不过你既然是别别人的库上裁出来的,别忘了加上gpl,以及严格遵守gpl,这个是原则问题,没什么对不对的,或者值得讨论的。

论坛徽章:
0
7 [报告]
发表于 2012-04-18 23:27 |只看该作者
回复 2# walleeee
谢谢,我自己这边也作了裁减了。不过还是要非常感谢你!

   

论坛徽章:
0
8 [报告]
发表于 2012-04-18 23:31 |只看该作者
回复 5# txgc_wm


    :wink:

很好,把解决办法摆出来。

只是你既然只要这2个编码转换,为什么不去搞个专门实现这个的代码,非在iconv上裁。

论坛徽章:
0
9 [报告]
发表于 2012-04-18 23:33 |只看该作者
回复 8# walleeee
目前需要对这个修改,是因为flash缺那么几K空间,后续硬件上会作升级,而且其它的字符编码转换方式在后续的开发中还是需要使用的。呵呵......

   

论坛徽章:
0
10 [报告]
发表于 2012-04-18 23:36 |只看该作者
回复 9# txgc_wm


哦,原来如此。感谢你分享出你的办法:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP