刚开始以为GNUstep和cygwin一样,会有一个专门的目录来访问宿主机的各个盘符,最终也没找到。虽然可以在shell中调用vim再写一个hello.m程序并保存,但之前的功夫岂不是白费了!
在打开GNUstep的shell环境后,所处的位置为/home/Administrator,执行ls命令,里面什么也没有,再执行ls -la,看到了.inputrc。如果能够找到.inputrc在宿主机中的位置,就能搞清楚GNUstep的文件系统与宿主机的关系了。打开Windows XP的搜索框,在GNUstep所在的盘符下搜索.inputrc文件,发现它的绝对路径为D:\GNUstep\msys\1.0\home\Administrator\(我是将GNUstep安装到了D盘),然后定位到D:\GNUstep\msys\1.0\目录,发现GNUstep的文件系统就存放在这里。至此,基本弄明白了GNUstep与宿主机之间的关系了:shell中的/home/Administrator/即对应着宿主机的D:\GNUstep\msys\1.0\home\Administrator\,以此为参照,就可以定位其它目录在宿主机上的位置。
终于能够编译、链接并执行hello,world!了。可以直接在shell中执行gcc命令来生成最终的可执行文件,但要加上一大堆的参数,这么做容易出错,也没有记录下编译过程。网上有将编译命令写入shell脚本的,在此我采用make命令来实现。相关的Makefile文件如下:
###############################################################################
#
# Filename : Makefile
# Description : 编译生成hello.exe
#
# Date : 2011-07-27 15:30
#
###############################################################################
CC = gcc
CFLAGS = -fconstant-string-class=NSConstantString
LFLAGS = -lobjc -lgnustep-base
LIB_HDRS = /GNUstep/System/Library/Headers
LIB_LIBS = /GNUstep/System/Library/Libraries
BIN = hello.exe
all : $(BIN)
$(BIN) : hello.o
$(CC) -o $@ $< -L$(LIB_LIBS) $(LFLAGS)
hello.o : hello.m
$(CC) -I$(LIB_HDRS) $(CFLAGS) -c $<
clean:
rm -f $(BIN) *.o
其中fconstant-string-class是gcc编译器专门针对Objective-C的一个选项,用于指定常量字符串所使用的类。其用法为:
-fconstant-string-class=class-name
如果不指定此项,默认的类名将是NXConstantString.
最后,生成的可执行文件是hello.exe,后缀名.exe是否为必须的?我试着在Makefile中指定BIN为hello,但最终生成的依然为hello.exe。为了clean的方便,还是带上吧。