甚至不太确定我的问题是什么。简而言之,对于一个类,我应该在这个c文件中添加一些功能,它附带了一个方便的makefile。
CFLAGS=-DUNIX -lreadline -lcurses -ansi -pedantic-errors
DEBUG=-g
#DEBUG=
all: shell
shell: shell.c parse.c parse.h
gcc $(CFLAGS) $(DEBUG) shell.c parse.c -o shell
clean:
rm -f shell *~我必须向shell.c添加特性。我对C语言非常陌生(通常使用c++或c#),所以我在一个单独的小tests.c文件中测试一些小东西。例如,查看某些系统调用返回的确切内容,如何正确地打印它们,等等。不管怎样,tests.c似乎符合不同的c编译器标准,或者我编译错了。如果我不小心使用//注释掉了一些东西,或者在shell.c的开头之外的某个地方声明了一个变量,编译器就会对我大喊大叫。它在tests.c中并不重要。
我用"gcc -o .c -o测试“编译了tests.c如果我用"gcc shell.c parse.c shell”编译shell,它编译得很好,但运行它只是给了我一个分段错误。我很想问我的助教这个问题,但是每次我作为他回答一些问题,他都会回答一个完全不同的问题。
对这里发生的事有什么想法吗?也许至少在正确的方向上有一个点?
发布于 2011-01-27 09:05:34
问题是您的makefile包含编译器的-ansi -pedantic-errors标志。这迫使它使用一个非常旧的C版本。也许这个Makefile是由你的讲师提供的,而他想要这样?这并不少见。
要使用这些新特性(//注释、块中任意位置的自动变量),只需删除这两个标志。如果你有这样的自由,我建议你也使用-std=c99 -Wall。
发布于 2011-01-27 09:04:03
-ansi -pedantic-errors防止了像//和函数中间的变量定义这样的不纯。去掉它,你就可以远离罪过了。
至于分段错误,最好的办法是通过gdb运行您的程序,看看它在哪里崩溃。
发布于 2011-01-27 09:04:45
要让GCC接受C99约定,告诉它这样做:
gcc -std=c99 ...
gcc -std=gnu99 ...因此,将-std=gnu99添加到您的CFLAGS值,并删除等同于-std=c89的-ansi。如果必须按照C89标准编码,请不要使用//注释。
我们不知道是什么导致了核心转储--但它可能是您试图修改某个字符串文字,或者其他大量问题中的任何一个。
https://stackoverflow.com/questions/4811954
复制相似问题