下一页 上一页 目录

9. 第一个例子:Xscrabble

Matt Chapman 的 Xscrabble 看起来像是一个有趣的程序,因为我碰巧是一位狂热的 ScrabbleTM 玩家。我下载了它,解压了它,并按照 README 文件中的步骤构建了它

     xmkmf
     make Makefiles
     make includes
     make

当然,它没有工作...

gcc -o xscrab -O2 -O -L/usr/X11R6/lib 
init.o xinit.o misc.o moves.o cmove.o main.o xutils.o mess.o popup.o
widgets.o display.o user.o CircPerc.o
-lXaw -lXmu -lXExExt -lXext -lX11 -lXt -lSM -lICE -lXExExt -lXext -lX11
-lXpm -L../Xc -lXc

BarGraf.o(.text+0xe7): undefined reference to `XtAddConverter'
BarGraf.o(.text+0x29a): undefined reference to `XSetClipMask'
BarGraf.o(.text+0x2ff): undefined reference to `XSetClipRectangles'
BarGraf.o(.text+0x375): undefined reference to `XDrawString'
BarGraf.o(.text+0x3e7): undefined reference to `XDrawLine'
etc.
etc.
etc...

我在 comp.os.linux.x 新闻组中询问了这件事,有人好心指出,显然在链接阶段没有找到 Xt、Xaw、Xmu 和 X11 库。嗯...

这里有两个主要的 Makefile,src 目录中的那个引起了我的兴趣。Makefile 中的一行将 LOCAL_LIBS 定义为:LOCAL_LIBS = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) 这里提到了链接器没有找到的库。

查找下一个对 LOCAL_LIBS 的引用,我在该 Makefile 的第 495 行看到了

      $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBS) $(LDLIBS)
$(EXTRA_LOAD_FLAGS)

现在这些 LDLIBS 是什么?

      LDLIBS = $(LDPOSTLIB) $(THREADS_LIBS) $(SYS_LIBRARIES)
$(EXTRA_LIBRARIES)

SYS_LIBRARIES 是

 SYS_LIBRARIES = -lXpm -L../Xc -lXc
是的!这里是缺少的库。

可能链接器需要在 LOCAL_LIBS 之前看到 LDLIBS... 所以,首先要尝试的是修改 Makefile,将第 495 行的 $(LOCAL_LIBS) 和 $(LDLIBS) 调换位置,使其现在读作

        $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LDLIBS) $(LOCAL_LIBS)
$(EXTRA_LOAD_FLAGS)                          ^^^^^^^^^^^^^^^^^^^^^^^

我尝试使用上述更改再次运行 make,瞧,看,这次它工作了。当然,Xscrabble 仍然需要一些微调和调整,例如重命名字典和注释掉其中一个源文件中的一些断言语句,但从那时起,它为我提供了许多小时的乐趣。

[请注意,新版本的 Xscrabble 现在以 rpm 格式提供,并且这个安装没有问题。]

您可以发送电子邮件给 Matt Chapman,并从他的 主页 下载 Xscrabble

       Scrabble is a registered trademark of the Milton Bradley Co., Inc.


下一页 上一页 目录