2012-11-03 305 views
5

我正在嘗試編譯一個小項目,但得到這個錯誤,我一直在四處搜索,並且主要是因爲文件擴展名不正確而導致此錯誤,但我不知道「噸真的認爲這是這裏的原因:gcc - 無法識別的文件:文件格式不被識別

gcc -c -W -Wall -ggdb -I. router.c -o router.o 
router.c:106: warning: unused parameter ‘hname’ 
router.c: In function ‘flood_neighbors’: 
router.c:464: warning: unused variable ‘bytes_rcvd’ 
router.c: At top level: 
router.c:536: warning: unused parameter ‘fd’ 
gcc -c -W -Wall -ggdb -I. link_info.h -o link_info.o 
gcc -c -W -Wall -ggdb -I. route.h -o route.o 
gcc -c -W -Wall -ggdb -I. sequence.h -o sequence.o 
gcc -W -Wall -ggdb -I. router.o link_info.o route.o sequence.o -o router 
link_info.o: file not recognized: File format not recognized 
collect2: ld returned 1 exit status 
make: *** [router] Error 1 

和我make文件看起來像:

CC = gcc 
INC = -I. 
FLAGS = -W -Wall -ggdb 

router: router.o link_info.o route.o sequence.o 
     $(CC) $(FLAGS) $(INC) $^ -o [email protected] 

router.o: router.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

sequence.o: sequence.h sequence.h 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

link_info.o: link_info.h link_info.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

route.o: route.h route.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

什麼我在困惑是三個目標文件的規則是相同的格式,但爲什麼只有鏈接的一個叫喊?非常感謝!

回答

4

我想在你的makefile中建議一些編輯。

CC = gcc 
INC = -I. 
FLAGS = -W -Wall -ggdb 

router: router.o link_info.o route.o sequence.o 
     $(CC) $(FLAGS) $(INC) $^ -o [email protected] 

router.o: router.c 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

sequence.o: sequence.h sequence.h //Where is the c file ? 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

link_info.o: link_info.h link_info.c //Change the order. Put c file first and then the header 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 

route.o: route.h route.c //Same as above 
     $(CC) -c $(FLAGS) $(INC) $< -o [email protected] 
+0

工作,謝謝!我真的不知道這裏的順序問題。 – lzt

+0

關於makefile的一些編輯主題 - 我忘了在我的makefile中完成我的一個目標,而我的舊.o已經損壞,因此問題。有時候這些解決方案很簡單! –

1

隨着新版本讓你可以刪除所有的目標規則,因爲化妝使用一個默認的規則來建立從.c和.cpp文件的一個對象。只需保留規則即可構建最終的可執行文件。

例如,更改文件,使其僅包含這一行:

router: router.o link_info.o route.o sequence.o 
    $(CC) $(FLAGS) $(INC) $^ -o [email protected] 
1

移動link_info.o在router:依賴列表的末尾,我懷疑你會在route.o炸燬代替。

您似乎在編譯頭文件爲C文件。我不知道海灣合作委員會在這種情況下做了什麼。在makefile規則中,如果要使用$ <生成要編譯的源文件,.c文件必須是第一個依賴項。

link_info:和route:rules將.c和.h文件顛倒過來,sequence:rule將兩次列出.h文件!

+0

頭文件應該包含在c文件中,而不是直接編譯。 –