2012-10-14 181 views
1

我在makefile中相當新。我正在嘗試創建一個makefile來編譯yu.c並鏈接yu.c以獲得一個名爲yu的可執行文件。
以下是我的代碼。我使用make -f mymakefile來運行該文件,每次運行它時,只有gcc -c yuFile.c完成。 我錯在哪裏?makefile不生成可執行文件

CC=gcc 

yu.o: yuFile.c 
    ${CC} -c yuFile.c 
yu: yuFile.o 
    ${CC} yu -o yuFile.o 
run-c: yu 
    ./yu 
clean: 
    rm -f "*.o" core 
+1

有點困惑的第一個目標。這將創建一個文件yuFile.o,所以它永遠不會滿足。其實yuFile.o - > yuFile.o是一個內置的目標,所以你甚至不需要第一個。刪除'yu.o:'目標,然後反轉'yu:'和'run-c:'目標。第一個目標是'run-c:',它將成爲默認目標。如果你更新'yuFile.c',Makefile會重建'yuFile.o',然後連接'yu',然後運行'run-c:'。 –

+0

調試'Makefile'-s的一般建議是使用'remake'(特別是使用'-x'標誌)。 –

回答

2

make沒有特定的目標,使文件中的第一個目標,所以你的情況就相當於make yu.o

通常,使第一目標all,使一切是建立:

all: yu 
.PHONY: all 

(注意:.PHONY防止make從什麼都不做,如果有一個名爲all已經文件)。

值得指出的是:你已經在yu目標中反轉了你的論點。它應該是

yu: yuFile.o 
    ${CC} yuFile.o -o yu 

或更一般

yu: yuFile.o 
    ${CC} $^ -o [email protected] 

$^指所有prereqs,並[email protected]表示目標,如在Automatic Variables記載)。

+0

我對這些代碼進行了這些更改。現在,生成可執行文件。但是我希望在鏈接階段之後,執行生成的可執行文件。似乎run-c:yu ./yu仍然不起作用。乾淨的線路也不起作用。 – user1559897

+0

@ user1559897:如果你只是輸入'make',那麼它只會成爲第一個目標,在這種情況下是'all'。如果你想輸入'make'並讓程序運行,那麼將所有行改爲'all:run-c'。 –

0

第一個目標是沒有指定參數時選取的目標。 標準是有一個「所有」目標第一:

所有:宇

而且,你的「玉」的目標是不正確。

yo: yufile.o 
    $(CC) -o [email protected] $^ 

應該工作

+0

$ @是什麼意思? – user1559897

+0

仍然錯誤。 '$ @ == yu'。 – nneonneo

+0

對,對不起。 $ @是目標,$ ^是所述目標的依賴關係 – perh