虽然不能在我的操作系统中使用printf函数,去可以使用sprintf函数得到需要显示的字符串,并将字符串我的drawstring函数显示在界面。但是在这里使用sprintf函数并像普通C应用程序一样连接成可执行文件。sprintf在stdio.h声明,在libc.lib里实现。我需要在ld连接的时候加入libc.lib库文件。问题是我的程序不能使用cygwin的libc.lib。我不得不重新编译这些源文件。
参照《OS自作入门》中选择的标准库源文件列表,我重新编译了如下程序:
abs.c
atof.c
atoi.c
errno.c
frexp.c
ldexp.c
memchr.c
memcmp.c
memcpy.c
memmove.c
memset.c
qsort.c
sprintf.c
strcat.c
strchr.c
strcmp.c
strcpy.c
strcspn.c
strdup.c
strlen.c
strncat.c
strncmp.c
strncpy.c
strpbrk.c
strrchr.c
strspn.c
strstr.c
strtol.c
strtoul.c
strtoul0.c
vsprintf.c
编译libc.lib函数库的Makefile内容如下:
TARGET = libc
OBJS = abs.o atof.o atoi.o errno.o frexp.o ldexp.o /
memchr.o memcmp.o memmove.o memset.o qsort.o /
sprintf.o strcat.o strcmp.o strcpy.o strcspn.o strdup.o /
strlen.o strncat.o strncmp.o strncpy.o strpbrk.o strrchr.o /
strspn.o strstr.o strtol.o strtoul.o strtoul0.o vsprintf.o
MAKE = make -r
CC1 = gcc
LD = ld
ALL :
$(MAKE) $(TARGET).lib
%.o : %.c Makefile
$(CC1) $*.c -c
$(TARGET).lib : $(OBJS) Makefile
ar r $@ $(OBJS)
clean :
-$(DELE) *.o
-$(DELE) $(TARGET).lib
这样我就可以在bootpack.c里使用sprintf函数。
#include <stdio.h>
…
#define MAX_VERSION 1
#define MIN_VERSION 0
…
char *str="Colimas Version";
char s[40];
sprintf(s,"%s %d.%d",str,MAX_VERSION,MIN_VERSION);
drawstring(binfo->vram, binfo->scrnx, 18, 10, COL8_FFFFFF, s);
在Makefile里只需要修改一下LD部分
$(LD) $(LDFLAGS) bootpack.o func.o hankaku $(LIB)/libc.lib -o bootpack.bin
运行结果: