- 论坛徽章:
- 0
|
楼主的工作做的很好,很强!支持一下!
这里向你反馈几个问题:
1、flex的版本问题:
我使用的linux版本是Fedro Core,gcc 版本是4.1.0,flex版本是2.5.4。使用svn下载你的程序源代码后,在未作任何修改的情况下,编译出错:
- $ make
- gcc -c -g -Wall main.c -o main.o
- gcc -c -g -Wall parser.c -o parser.o
- gcc -c -g -Wall reg.c -o reg.o
- gcc -c -g -Wall symbol.c -o symbol.o
- flex -o scanner.c scanner.l
- flex: can't open scanner.c
- make: *** [scanner.c] 错误 1
复制代码
经过检查,发现问题:
- flex -o scanner.c scanner.l
复制代码
2.5.4的flex中,-o和scanner.c中不能有空格,改为如下:
- flex -oscanner.c scanner.l
复制代码
2、链接的问题
我把Makefile中:
- %.c : %.l
- $(LEX) -o $@ $<
复制代码
改为:
发现最后链接时,仍然有错误:
- gcc -o cminus-compiler main.o parser.o reg.o scanner.o symbol.o scanner.o
- scanner.o: In function `yylex':/tmp/cminus-compiler/scanner.c:573: multiple definition of `yyin'
- lex.yy.o:/tmp/cminus-compiler/lex.yy.c:572:第一次在此定义
- scanner.o: In function `yylex':/tmp/cminus-compiler/scanner.c:573: multiple definition of `yyout'
- lex.yy.o:/tmp/cminus-compiler/lex.yy.c:572:第一次在此定义
- scanner.o: In function `yylex':/tmp/cminus-compiler/scanner.c:582: multiple definition of `line_no'
- ....
复制代码
原因是scanner.o被链接了两次:
gcc -o cminus-compiler main.o parser.o reg.o scanner.o symbol.o scanner.o
我把你的Makefile稍稍改了一下,才编译成功,以下是修改后的版本:
- CC = gcc
- LEX = flex
- CFLAGS = -g -Wall
- LDFLAGS =
- SOURCES := $(wildcard *.c)
- ifneq (scanner.c, $(wildcard scanner.c))
- SOURCES := $(SOURCES) scanner.c
- endif
- OBJS = $(patsubst %.c, %.o, $(SOURCES))
- TARGET = cminus-compiler
- all : $(OBJS)
- $(CC) -o $(TARGET) $(OBJS) $(LDFLAGS)
- %.o : %.c
- $(CC) -c $(CFLAGS) $< -o $@
- %.c : %.l
- $(LEX) -o$@ $<
- clean:
- rm -rf scanner.c
- rm -rf $(OBJS)
- rm -rf $(TARGET)
- rm -rf *~
- rm -rf core*
复制代码
PS:楼主工作了吗?在哪高就啊?希望能够继续增加cminus的功能,我们支持你!
[ 本帖最后由 DennisRitchie 于 2007-10-16 15:25 编辑 ] |
|