LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4065|回复: 20

LFS下艰苦而漫长的zhcon安装历程,希望弟兄们能从中受益

[复制链接]
发表于 2002-12-23 13:54:52 | 显示全部楼层 |阅读模式
安装完LFS之后,我并没有急于安装BLFS,我想先把系统清理一下,升级一些软件的版本,再用优化的编译参数重新编译安装一遍。所以我先把内核升级到2.4.20,把gcc和glibc升级到gcc-3.2.1和glibc-2.3.1。顺便也把bash升级到bash-2.05b。接下来,为了使编译过程自动化一些,我开始写一个shell程序,但是,写到一半我就不干了,一方面是因为这个程序纯粹就是命令的堆砌,没什么意思,我想写一个更自动化的(最好能象gentoo那样);另一方面,写这个程序要在LFS下编辑调试,没有gpm很不方便。只好先按照BLFS的说明书安装gpm。gpm装好之后,为了支持中文输入,又需要安装zhcon作为中文平台。于是又下载zhcon-0.2.1的安装包,解压,configure之后,make时出现一堆错误提示,都是与“X”有关。查看错误提示中的文件路径,都指向zhcon-0.2.1/tools下的getbpsf.c。用vi查看getbpsf.c,发现引用xwindow的头文件<X11/Xlib.h>,于是把mandrake9下的/usr/X11R6/include/X11/Xlib.h复制到zhcon-0.2.1/tools目录下,修改getbpsf.c,把#include <X11/Xlib.h>改为#include "X11/Xlib.h",make之后,还是出来一大堆错误提示,再查,发现<X11/Xlib.h>里面又引用了<X11/X.h>,<X11/Xfuncproto.h>,<X11/Xosdefs.h>等头文件。再把这几个头文件如法泡制。编译时,还是通不过,但这次的错误提示不一样了,这次是与Xlib有关,因为在提示中有"-lX11“等字样。于是又找xwindow的库文件,就这样搞来搞去,最后发现还是老老实实地先把xwindow安装了再说。
      难道不装xwindow,zhcon就安装不上? 看到laugher兄提供的安装经验,我觉得完全可行。laugher兄的做法是这样的:
解压之后,先执行./configure,然后修改tools目录下的Makefile,把第97行bin_PROGRAMS = uc2win win2mb getbpsf
中的getbpsf删去,把103,104,105,129,130,131行
getbpsf_SOURCES = getbpsf.c
getbpsf_LDADD = -L/usr/X11R6/lib -lX11
getbpsf_CPPFLAGS = -I/usr/X11R6/include
getbpsf_OBJECTS = getbpsf.o
getbpsf_DEPENDENCIES =
getbpsf_LDFLAGS =
这6行全注释,再把第145行,146行
SOURCES = $(uc2win_SOURCES) $(win2mb_SOURCES) $(getbpsf_SOURCES)
OBJECTS = $(uc2win_OBJECTS) $(win2mb_OBJECTS) $(getbpsf_OBJECTS)
最后一个宏$(getbpsf_SOURCES)删除,把211,212,213行
getbpsf: $(getbpsf_OBJECTS) $(getbpsf_DEPENDENCIES)
@rm -f getbpsf
$(LINK) $(getbpsf_LDFLAGS) $(getbpsf_OBJECTS) $(getbpsf_LDADD) $(LIBS)
这3行全注释掉。然后编辑src目录下的Makefile文件,找到
。。。
LIBINTL =
LIBS = -lgpm -ldl -lutil  -L/usr/lib/unicon -L/usr/local/lib
。。。
在LIBS这一行中加上-lcurses,再接着执行make能通过。安装之后直接执行zhcon,结果屏幕一闪之后,当即死机。屏幕上什么提示都没有。按Alt+Fn(n=1~5)切换到其他终端,但一个终端也动不了。只好reset重新启动。
     会不会是修改源程序造成的?我做了一个试验,把在LFS下编译的zhcon复制到mandrake所在的分区,重新启动进入mandrake,执行zhcon。结果没有死机,只是提示“can not open gbfont!”。同样的程序在不同的环境下有不同的表现,这完全可以肯定死机不是zhcon本身造成的了。于是,我开始怀疑是显示方式的问题,因为zhcon要采用图形方式驱动,才能显示汉字。
      zhcon使用的图形驱动方式有三种,frambuffer、vga和libggi。在我的机器上可以使用哪一种来支持zhcon呢?我的LFS没有安装ggi,就只能考虑用vga和frambuffer两种方式来支持zhcon。首先考虑frambuffer。我的mandrake是可以支持frambuffer使用的,我查看mandrake下的lilo.conf文件,发现vga=788,于是也照抄参数修改LFS下的lilo.conf,把vga=normal改为vga=788,以便激活frambuffer。执行lilo -v后重新启动,结果启动时死机。再改为其它参数,结果还是一样。后来查了资料才知道是内核不支持frambuffer造成的。既然内核不支持,那就只好重新编译内核了。但是在make menuconfig时,我把各项参数从头看到尾,就是看不到frambuffer。不可能呀! 我以前编译内核,曾经见到过这项参数,虽然我的内核是用patch方式升级到2.4.20的,也应该不会有什么问题。迫于无奈,只好重新启动进入mandrake,在KDE的内核配置程序中查看内核配置参数。结果无意中发现,如果不选中“Code maturity level option",在console drivers中就不会出现fram-buffer support的选项。知道原因后,进入LFS系统,编译核心时先选中“Code maturity level option",然后在console drivers中选中fram-buffer support。编译后修改lilo.conf文件,加入新编译的核心。lilo -v后重新启动,还是死机。
      看到在zhcon的README文件中建议在lilo.conf中加上vga=0x303这个参数,以便激活frambuffer支持,我又把vga改为vga=0x303,结果还是一样。看来不应该是lilo.conf中vga参数设置的问题了。只好检查核心配置,看看是那儿出了问题。在仔细参考了mandrake的核心配置参数后,结果发现在frambuffer中参数选得太少,只选中了与显卡有关的nvidia那一项。这次把大部分通用的都加上,重编核心之后,终于在启动时看到了小企鹅。接着执行zhcon,结果显示出与gpm有关的错误信息。怀疑是gpm的问题,将/etc/rc.d/init.d/gpm去掉后重新启动,问题依旧。用frambuffer支持图形显示的问题已经解决了,会不会是编译zhcon时造成的问题?因为要反复编译zhcon,我没有每一次都删掉原来zhcon源代码,就直接configure、make、make install,可能会使新的编译受到过去编译残留的代码影响。考虑到这个因素的影响,我把原来的zhcon代码删去,重新解压,configure之后按laugher兄提供的方法安装,执行zhcon,结果仍然不行。执行zhcon后在屏幕上显示如下信息后终端死机,不过这次只是死掉一个终端,没有所有的终端全死:

*** debug ***: [/usr/src/gpm-1.20.0/src/liblow.c(202)]:
                                                       VC: 1
                                                                                   oops(): [/usr/src/gpm-1.20.0/src/liblow.c(247)]:
                                                                                                            I couln't get any memory! I die!
                                                                                                                                                                      [root:~]#

看着屏幕上带着"gpm-1.20.0"字符字样的错误提示,我只好怀疑是gpm的问题。在zhcon里面自带了一个gpm-1.19.6.patched.tar.gz,应该与zhcon不会冲突吧。安装之后,执行zhcon,终于成功了,而且在zhcon下也能使用gpm。
接下来,我用没有frambuffer支持的内核重新启动,执行zhcon,这次没有死机现象发生,屏幕出现了zhcon的欢迎画面。只不过是采用VGA方式驱动,分辨率只有640x480,字体显示也没有frambuffer下800x600的分辨率那么美观。由此推断,zhcon在编译安装后不能使用,问题并不在于采用那种图形驱动方式,关键在于必须安装zhcon自带的gpm-1.19.6.patched。这个gpm-1.19.6.patched是修改过源代码的,不会与zhcon发生冲突。只有它能支持在zhcon下使用鼠标。
经过这番折腾,我对软件的编译安装增加了不少经验,也有了几点深刻体会:

1. 要在zhcon-0.2.1下使用gpm,就得要安装zhcon-0.2.1自带的gpm-1.19.6.patched.tar.gz(在zhcon-0.2.1/tools下),这样两者才能兼容。如果使用没有修改过源代码的gpm,就不可能在zhcon下使用gpm。如果两者发生冲突,还会使zhcon无法启动。
2. 在没有安装XFree的时候,安装zhcon并不难,只要用laugher兄提供的方法安装就行了。如果安装了XFree,唯一可能发生问题的是缺少-lcurses的支持了。如果编译时碰到这个问题:

make[3]: Leaving directory `/home/zhcon/zhcon-0.2.1/src/display'
make[3]: Entering directory `/home/zhcon/zhcon-0.2.1/src'
c++ -O2 -DNDEBUG -funsigned-char -Wall -Wl,-rpath=/usr/lib/unicon -o zhcon -L/usr/lib/unicon basefont.o big52gbdecoder.o big5decoder.o configfile.o console.o gb2big5decoder.o gbdecoder.o gbkdecoder.o graphdev.o hzdecoder.o jisdecoder.o kscdecoder.o main.o window.o winime.o zhcon.o overspotclient.o nativeinputserver.o inputclient.o inputmanager.o inputserver.o candilist.o uniconinputserver.o configserver.o nativebarclient.o mouse.o display/libdisplay.a -ldl -lutil -L/usr/lib/unicon -L/usr/local/lib
zhcon.o(.text+0x1211): In function `Zhcon::InitTty()':
: undefined reference to `tgetent'
zhcon.o(.text+0x124d): In function `Zhcon::InitTty()':
: undefined reference to `tgetstr'
zhcon.o(.text+0x1262): In function `Zhcon::InitTty()':
: undefined reference to `tgetstr'
zhcon.o(.text+0x1277): In function `Zhcon::InitTty()':
: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
make[3]: *** [zhcon] 错误 1
make[3]: Leaving directory `/home/zhcon/zhcon-0.2.1/src'
make[2]: *** [all-recursive] 错误 1
make[2]: Leaving directory `/home/zhcon/zhcon-0.2.1/src'
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/home/zhcon/zhcon-0.2.1'
make: *** [all-recursive-am] 错误 2

可以修改src目录下的Makefile,找到其中的
LIBS = -lgpm -ldl -lutil  -L/usr/lib/unicon -L/usr/local/lib
加上-lcurses即可。更简单的办法是把错误提示中的这部分提示信息

c++ -O2 -DNDEBUG -funsigned-char -Wall -Wl,-rpath=/usr/lib/unicon -o zhcon -L/usr/lib/unicon basefont.o big52gbdecoder.o big5decoder.o configfile.o console.o gb2big5decoder.o gbdecoder.o gbkdecoder.o graphdev.o hzdecoder.o jisdecoder.o kscdecoder.o main.o window.o winime.o zhcon.o overspotclient.o nativeinputserver.o inputclient.o inputmanager.o inputserver.o candilist.o uniconinputserver.o configserver.o nativebarclient.o mouse.o display/libdisplay.a -ldl -lutil -L/usr/lib/unicon -L/usr/local/lib

用鼠标复制下来,进入src目录,粘贴到命令行上,再加上-lcurses后,执行即可。再回到zhcon-0.2.1目录下,直接make就行了。
3. 编译内核时一定要选上“Code maturity level option"。否则很多新功能都见不到。对于frambuffer的支持要多选几项,没有把握的可以编译成模块。以后有经验了,再逐步调整。
4. 内核编译支持frambuffer后,要在lilo.conf中加上vga=xxx激活(具体参数可见zhcon的README)。如果在内核不支持时加上这个参数,会使系统无法启动。
5. 折腾这么长时间,最大的收获不在于成功安装了zhcon。而是在实践中摸索出来了一些解决问题的方法和思路,即:首先要高度关注软件在编译不能通过和不能使用给出的错误提示,这些错误提示是解决问题的起点。如在编译zhcon时出现如下问题:

mouse.o: In function `Mouse::Open(Console*, int, int, int)':
mouse.o(.text+0xe4): undefined reference to `Gpm_Open'
mouse.o(.text+0xee): undefined reference to `gpm_fd'
mouse.o(.text+0xfb): undefined reference to `Gpm_GetSnapshot'
mouse.o: In function `Mouse::Close()':
mouse.o(.text+0x151): undefined reference to `Gpm_Close'
mouse.o: In function `Mouse:rocess()':
mouse.o(.text+0x1a8): undefined reference to `Gpm_GetEvent'
collect2: ld returned 1 exit status
make[3]: *** [zhcon] Error 1
make[3]: Leaving directory `/usr/src/zhcon-0.2.1/src'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/usr/src/zhcon-0.2.1/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/src/zhcon-0.2.1'
make: *** [all-recursive-am] Error 2

此时要注意错误提示中的“Gpm_Open","Gpm_Close”,“Gpm_GetEvent”等等,即使你不懂编程,你也可以从字眼上看出它们与gpm有关,自然,解决问题的焦点就放在了gpm上。那么这个问题是怎么发生的呢?这是我在删除gpm后编译安装zhcon时给出的错误提示,这些错误提示表明需要gpm的支持才能安装zhcon。顺便说一句,在没有gpm时zhcon的configure能通过,并显示如下结果:
Configuration:
Target system:             i686-pc-linux-gnu
Source code location:      .
C++ Compiler:              c++
C++ Compiler flags:        -O2 -DNDEBUG -funsigned-char -Wall
C   Compiler:              gcc
C   Compiler flags:        -O2 -DNDEBUG -funsigned-char -Wall
VGA support:               yes
gpm moues support:         no
libggi support:            no
unicon support:            no
zhcon binary dir:          /usr/local/bin
zhcon files dir:           /usr/local/lib/zhc
但是在编译时却需要gpm的支持。这说明zhcon的configure存在一些问题。

   如果没有任何的错误提示,系统就崩溃了,那又怎么办?非常不幸的是我在安装zhcon的过程中就碰到了这个问题。在这个时候要记住发生问题时的各种情况,如死机时的现象,死机时启动了那些程序,在这之前以运行了什么程序,程序启动时加了什么参数等等。然后根据这些情况考虑所有可能发生问题的原因并通过做一些试验的方法逐步排除,如换个环境来启动这些程序,看看有什么反应。这些办法都是在实践中一步一步逼出来的。当发生zhcon死机的问题后,我毫无办法。我不知道zhcon不能使用是什么原因造成的? 是删除了Makefile中的与getbpsf有关的部分,还是编译时少了什么文件?还是zhcon不能在LFS系统下将终端从字符显示方式转换成图形显示方式?自从按laugher兄的方法编译成功但又无法使用zhcon后,这些问题就一直困扰着我。
     每一个有硬件DIY经验的人在碰到硬件问题时,都会采用这样的方法解决:把怀疑有问题的硬件(一般是显卡、声卡等等)拨下来,插到好的机器上,或者是把好的硬件插到有问题的机器上,进行各种测试,直到把有问题的硬件找出来。对于zhcon的安装问题,也是可以采用类似思路来解决的。首先怀疑是修改Makefile的问题,考虑到mandrake下是可以运行zhcon的。我就把在LFS下编译好的zhcon直接复制到mandrake下试运行,看看有什么现象发生。结果,没有发生死机现象。这就使我怀疑死机是系统环境造成的。首先想到的是图形驱动的问题。在使内核支持frambuffer后,执行zhcon仍然不行,但是出现了错误提示。正是根据错误提示中的“[/usr/src/gpm-1.20.0/src/liblow.c(202)"才想到是gpm-1.20.0造成的问题。在安装zhcon自带的gpm-1.19.6.patched后,问题终于解决。
     看到如此艰难的安装经历,大家一定会奇怪,直接用zhcon的rpm包安装不是更省事吗?事实确实如此。但DIY的最大乐趣正是在于亲自动手解决实际问题。在解决问题的过程中,我大大加深了对linux下软件编译安装过程的认识,摸索总结出了解决实际问题的经验和方法。这些认识和经验比一个zhcon要重要得多,也很值得。这才是一个DIYer所真正需要的东西。我把这个过程整理出来发表,也是为了让大家分享我的实际经验,以便举一反三,提高解决实际问题的能力。
     最后,在问题解决之后,我又作了更加深入的研究,对zhcon的安装问题又有了深刻的认识,研究结果将另文发表。

注:
  getbpsf是一个用来生成big psf格式字体的程序,是一个韩国人写的。删除Makefile中有关getbpsf的部分本身不会对zhcon的运行造成影响。
发表于 2002-12-23 14:42:16 | 显示全部楼层
真是历害啊!
 楼主| 发表于 2002-12-23 14:51:30 | 显示全部楼层
谢谢,HopeCao 兄过誉了。
发表于 2002-12-23 15:11:21 | 显示全部楼层
谢谢kj兄的宝贵经验,看过很有点体会。
也想好好折腾折腾,不过马上工作就要紧张了,没什么时间,苦恼
发表于 2002-12-23 15:17:55 | 显示全部楼层
我一看别人写代码就头痛!
有时候也想自己去找办法解决,但是看着看着就坚持不下去了!
发表于 2002-12-23 16:32:42 | 显示全部楼层
精彩!
发表于 2002-12-23 17:03:45 | 显示全部楼层
er.......为什么那么复杂...就是鼠标用不了而已..其他什么问题都没..
是不是把简单的复杂化了.......为什么你们装lfs总能碰到那么多的问题..而我是不是错了...
发表于 2002-12-23 17:05:14 | 显示全部楼层
照上面的做法,鼠标是可以用的。
发表于 2002-12-23 17:09:24 | 显示全部楼层
不是这个问题..为什么你们总能碰到那么多问题...很多都是基础的东西..能用linux应该都会的了》。。
发表于 2002-12-23 17:12:58 | 显示全部楼层
遇到问题是福气啊,遇到一个问题,就能学到一些东西,不管是多是少,总有所收获。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表