2011-01-27 47 views
0

甚至不太确定我的问题是什么。简而言之,对于一个类,我应该为这个c文件添加一些功能,并且它带有一个方便的makefile。C gcc编译问题和makefiles

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。

我编译tests.c与“gcc tests.c -o tests” 如果我使用“gcc shell.c parse.c -o shell”编译shell,它编译得很好,但运行它只是给我一个分段故障。我很想问我的电讯管理局这件事,但每次我作为他的事情时,他都会回答一个完全不同的问题......

对这里发生了什么有什么想法?或许至少有一个正确的方向?

+0

这是作业,对不对? – Spaceghost 2011-01-27 01:04:39

+1

@Spaceghost OP在第一段中说。 – chrisaycock 2011-01-27 01:06:59

回答

1

问题是您的makefile包含编译器的-ansi -pedantic-errors标志。这迫使它使用C的一个非常旧的版本。也许这个Makefile是由你的教师提供的,他想要那样吗?这并不罕见。

要使用这些新功能(//注释,块中任何位置的自动变量)只需删除这两个标志。如果你有自由,我推荐也使用-std=c99 -Wall

0

你为什么直接调用gcc而不是使用makefile来编译? makefile增加了许多最有可能重要的附加命令行选项gcc。如果使用make all进行编译,你会看到相同的行为吗?

由于您是C的新手,我建议您在CFLAGS行中添加-Wall。这将启用所有编译器警告,这可能会提醒您一个可能错过的细微错误。

+0

因为我这样编译我的tests.c文件,并且意识到事情并不一样。我担心有什么不对,还有什么在测试中起作用。c可能不在shell.c中 – cost 2011-01-27 01:06:17

1

-ansi -pedantic-errors可防止杂质如//和函数中间的变量定义。删除它,你应该能够消失。

至于分段错误,最好的办法是通过gdb运行你的程序来查看它崩溃的地方。

1

为了让GCC接受C99公约,告诉它这样做:

gcc -std=c99 ... 
gcc -std=gnu99 ... 

所以,加-std=gnu99到您的CFLAGS值,并移除-ansi这相当于-std=c89。如果您必须编码为C89标准,请勿使用//评论。

我们无法确定导致核心转储的原因 - 但可能是因为您试图修改某处的字符串文本或任何大量其他问题。