2011-04-07 70 views
4

我很新的Makefiles,我試圖從3個文件,file1.c,file2.c和file1.h建立一個可執行文件到一個名爲exFile的可執行文件。繼承人我得到了什麼:文件格式無法識別;作爲鏈接器腳本(makefile的問題)

all: exFile 
exFile: file1.o file2.o 
    gcc -Wall -g -m32 repeat.o show.o -o repeat 

file1.o: file1.c file1.h 
    gcc -Wall -g -m32 -S file1.c -o file1.o 

file2.o: file2.c 
    gcc -Wall -g -m32 -S file2.c -o file2.o 

我搜索了這種格式的makefile網頁,但我想出了空手而歸,所以我想知道如果有人可以提供幫助。當它試圖編譯我得到:

usr/bin/ld:file1.o:1: file format not recognized; treating as linker script 

我編譯使用匯編文件的程序,但我不知道該怎麼用C文件或文件file1.h做。 file1.c包含file1.h,所以我必須鏈接它們(我認爲?)。任何建議或鏈接的參考,將不勝感激

回答

6

您的gcc命令行有兩個問題。首先,您要指定-S標誌,這會導致gcc發出彙編代碼,而不是目標代碼。其次,您錯過了-c標誌,它告訴gcc將文件編譯爲目標文件,但不會將其鏈接。如果您只是刪除-S而不更改其他任何內容,則最終將生成一個名爲file1.o的可執行程序和另一個名爲file2.o的可執行程序,而不是兩個目標文件。

除了這些錯誤,你可以通過使用模式規則來簡化你的makefile。我建議你試試下面的不是:

all: exFile 
exFile: file1.o file2.o 
    gcc -Wall -g -m32 $^ -o [email protected] 

%.o: %.c 
    gcc -Wall -g -m32 -c $< -o [email protected] 

file1.o: file1.h 

或者,如EmployedRussian指出,你可以用一個利用更多的GNU的內置功能,使事情更加最小走:

CC=gcc 
CFLAGS=-Wall -g -m32 

all: exFile 

exFile: file1.o file2.o 
     $(LINK.c) $^ -o [email protected] 

file1.o: file1.h 
+0

這個makefile仍然很糟糕。你不需要一個模式規則 - make有一個就像它已經內置的一樣。另外,exFile將永遠是過時的,因爲你正在構建「repeat」。如果您提供瞭如何更正makefile的示例,請更好地完成它! – 2011-04-07 06:15:28

+0

@僱傭的俄羅斯人:哎呀,謝謝你收到錯誤(從OP複製)。至於簡化makefile,是的,它可能更簡單,但我不確定這樣做會有助於OP的理解,因爲它不是導致問題的makefile結構。 – 2011-04-07 14:54:31

+0

是的,謝謝大家。 – user695978 2011-04-07 18:53:54

0

-S切換到GCC它告訴輸出彙編這樣的:

gcc -Wall -g -m32 -S file1.c -o file1.o 

是將彙編成file1.o但你想,大概,編譯file1.c成目標代碼:

gcc -Wall -g -m32 file1.c -o file1.o 

當連接得到你的file1.o是困惑,因爲file1.o是當連接期待的對象C和彙編頌歌,因此你的錯誤。

所以擺脫-S交換機file1.ofile2.o

+0

謝謝對於迴應,但仍然沒有運氣...得到相同的錯誤。我完全沉迷於此。我會更多地研究它我知道我並不遙遠,可能只是我忽略的一些細節。 – user695978 2011-04-07 04:37:04

+0

@ user695978:如果你用file1.o來獲取文件類型,會發生什麼? – 2011-04-07 05:13:33