2011-01-27 85 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標準,請勿使用//評論。

我們無法確定導致核心轉儲的原因 - 但可能是因爲您試圖修改某處的字符串文本或任何大量其他問題。