首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C gcc编译问题和生成文件

C gcc编译问题和生成文件
EN

Stack Overflow用户
提问于 2011-01-27 08:59:16
回答 4查看 1.4K关注 0票数 0

甚至不太确定我的问题是什么。简而言之,对于一个类,我应该在这个c文件中添加一些功能,它附带了一个方便的makefile。

代码语言:javascript
复制
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,它编译得很好,但运行它只是给了我一个分段错误。我很想问我的助教这个问题,但是每次我作为他回答一些问题,他都会回答一个完全不同的问题。

对这里发生的事有什么想法吗?也许至少在正确的方向上有一个点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-27 09:05:34

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-01-27 09:04:03

-ansi -pedantic-errors防止了像//和函数中间的变量定义这样的不纯。去掉它,你就可以远离罪过了。

至于分段错误,最好的办法是通过gdb运行您的程序,看看它在哪里崩溃。

票数 1
EN

Stack Overflow用户

发布于 2011-01-27 09:04:45

要让GCC接受C99约定,告诉它这样做:

代码语言:javascript
复制
gcc -std=c99 ...
gcc -std=gnu99 ...

因此,将-std=gnu99添加到您的CFLAGS值,并删除等同于-std=c89-ansi。如果必须按照C89标准编码,请不要使用//注释。

我们不知道是什么导致了核心转储--但它可能是您试图修改某个字符串文字,或者其他大量问题中的任何一个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4811954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档