C gcc编译问题和makefile

时间:2011-01-27 00:59:16

标签: c gcc

甚至不确定我的问题是什么。缺点是,对于一个我应该为这个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#),所以我在一个单独的小test.c文件中测试一些小东西。比如,看看究竟是什么系统调用返回,如何正确打印它们等等。无论如何,tests.c似乎符合不同的c编译器标准或者我编译错了。如果我不小心使用//来评论某些内容或在shell.c中的某个地方声明一个变量,编译器会对我大喊大叫。它并不关心tests.c。

我使用“gcc tests.c -o tests”编译tests.c 如果我使用“gcc shell.c parse.c -o shell”编译shell,它编译得很好,但运行它只会给我一个分段错误。我很乐意向TA询问这个问题,但每当我作为他的时候,他都会回答一个完全不同的问题......

有关这里发生了什么的任何想法?也许至少在正确的方向上有一点?

4 个答案:

答案 0 :(得分:1)

-ansi -pedantic-errors可以防止像//这样的杂质和函数中间的变量定义。删除它,你应该能够罪过。

至于细分错误,最好的办法是通过gdb运行程序,看看它崩溃的位置。

答案 1 :(得分:1)

要让GCC接受C99约定,请告诉它:

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

因此,请将-std=gnu99添加到您的CFLAGS值,然后移除相当于-ansi的{​​{1}}。如果您必须编码为C89标准,请不要使用-std=c89条评论。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

为什么要直接调用gcc而不是使用makefile进行编译? makefile添加了许多其他最重要的命令行gcc选项。如果使用make all进行编译,是否会看到相同的行为?

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