Y86模拟编译失败(CSAPP)
Fail to compile the Y86 simulatur (CSAPP)
我在编译用于 CSapp book 练习的 Y86 模拟器时遇到问题。似乎变量 lineno 被定义了多次
这里是错误
make
(cd misc; make all)
make[1]: Entering directory '/home/platoali/CSapp/sim/sim/misc'
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: yas.o:/home/platoali/CSapp/sim/sim/misc/yas.h:13: multiple definition of `lineno'; yas-grammar.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:32: yas] Error 1
这是我找到的声明
$ grep -R "int lineno" *
misc/isa.c: int lineno = 0;
misc/yas.c:int lineno = 1; /* Line number of input file */
misc/yas.c:int lineno; /* What line number am I processing? */
misc/yas.h:int lineno;
misc/hcl.lex:extern int lineno;
misc/hcl.y:int lineno = 1;
misc/hcl.tab.c:int lineno = 1;
misc/lex.yy.c:extern int lineno;
代码可从以下位置访问:CS:APP3e Student Site
谁能帮我解决这个问题?好像lineno声明了很多次,但是我找不到它在哪里?
编辑
$ grep -R "lineno" *
misc/isa.c: int lineno = 0;
misc/isa.c: lineno++;
misc/isa.c: fprintf(stderr, "Line %d:%s\n", lineno, buf);
misc/isa.c: fprintf(stderr, "Line %d:%s\n", lineno, buf);
misc/yas.c:int lineno = 1; /* Line number of input file */
misc/yas.c:int lineno; /* What line number am I processing? */
misc/yas.c: fprintf(out, "Line %d, Byte %d: ", lineno, bytepos);
misc/yas.c: fprintf(stderr, "Error on line %d: %s\n", lineno, message);
misc/yas.c: lineno, bytepos, input_line);
misc/yas.c: lineno = 1;
misc/yas.h:int lineno;
misc/hcl.lex:extern int lineno;
misc/hcl.lex:[\n] lineno++;
misc/hcl.lex:"#".*\n lineno++ ;
misc/hcl.y:int lineno = 1;
misc/hcl.y: fprintf(stderr, "Error, near line %d: %s\n", lineno, str);
misc/yas-grammar.lex:#{Char}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:"//"{Char}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:"/*"{Char}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:{Blank}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:<ERR>{Char}*{Newline} {fail("Invalid line"); lineno++; BEGIN 0;}
我遇到了同样的问题,是关于 gcc 的。 gcc-10 将默认值从“-fcommon”更改为“-fno-common”。您需要将“-fcommon”标志添加到 Makefiles。例如,
旧misc/Makefile:
CFLAGS=-Wall -O1 -g
LCFLAGS=-O1
新 misc/Makefile:
CFLAGS=-Wall -O1 -g -fcommon
LCFLAGS=-O1 -fcommon
您可以查看 here 了解更多详情。
我在编译用于 CSapp book 练习的 Y86 模拟器时遇到问题。似乎变量 lineno 被定义了多次
这里是错误
make
(cd misc; make all)
make[1]: Entering directory '/home/platoali/CSapp/sim/sim/misc'
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: yas.o:/home/platoali/CSapp/sim/sim/misc/yas.h:13: multiple definition of `lineno'; yas-grammar.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:32: yas] Error 1
这是我找到的声明
$ grep -R "int lineno" *
misc/isa.c: int lineno = 0;
misc/yas.c:int lineno = 1; /* Line number of input file */
misc/yas.c:int lineno; /* What line number am I processing? */
misc/yas.h:int lineno;
misc/hcl.lex:extern int lineno;
misc/hcl.y:int lineno = 1;
misc/hcl.tab.c:int lineno = 1;
misc/lex.yy.c:extern int lineno;
代码可从以下位置访问:CS:APP3e Student Site
谁能帮我解决这个问题?好像lineno声明了很多次,但是我找不到它在哪里?
编辑
$ grep -R "lineno" *
misc/isa.c: int lineno = 0;
misc/isa.c: lineno++;
misc/isa.c: fprintf(stderr, "Line %d:%s\n", lineno, buf);
misc/isa.c: fprintf(stderr, "Line %d:%s\n", lineno, buf);
misc/yas.c:int lineno = 1; /* Line number of input file */
misc/yas.c:int lineno; /* What line number am I processing? */
misc/yas.c: fprintf(out, "Line %d, Byte %d: ", lineno, bytepos);
misc/yas.c: fprintf(stderr, "Error on line %d: %s\n", lineno, message);
misc/yas.c: lineno, bytepos, input_line);
misc/yas.c: lineno = 1;
misc/yas.h:int lineno;
misc/hcl.lex:extern int lineno;
misc/hcl.lex:[\n] lineno++;
misc/hcl.lex:"#".*\n lineno++ ;
misc/hcl.y:int lineno = 1;
misc/hcl.y: fprintf(stderr, "Error, near line %d: %s\n", lineno, str);
misc/yas-grammar.lex:#{Char}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:"//"{Char}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:"/*"{Char}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:{Blank}*{Return}*{Newline} {finish_line(); lineno++;}
misc/yas-grammar.lex:<ERR>{Char}*{Newline} {fail("Invalid line"); lineno++; BEGIN 0;}
我遇到了同样的问题,是关于 gcc 的。 gcc-10 将默认值从“-fcommon”更改为“-fno-common”。您需要将“-fcommon”标志添加到 Makefiles。例如,
旧misc/Makefile:
CFLAGS=-Wall -O1 -g
LCFLAGS=-O1
新 misc/Makefile:
CFLAGS=-Wall -O1 -g -fcommon
LCFLAGS=-O1 -fcommon
您可以查看 here 了解更多详情。