2016-12-10 68 views
0

這裏是我的makefile:爲什麼我的makefile不能按預期工作?

SHELL = /bin/sh 
CC=g++ 
CFLAGS=-I. 
DEPS = settings.h 
OBJ = settings.o tomato.o 
EXDIR = $(ROOT_TOMATO)/bin 
OBJDIR = $(ROOT_TOMATO)/obj 

$(OBJDIR)/%.o: %.cpp $(DEPS) 
    $(CC) -c -o [email protected] $< 

$(EXDIR)/tomato: $(OBJ) 
    $(CC) -o [email protected] $^ $(CFLAGS) 

clean: 
    rm -f a.out *.o 

all: tomato 

在第9行和10日,我曾試圖把它創建的對象文件,並把它們放在OBJDIR,但它而不是放置在當前目錄下,ROOT_TOMATO obj的文件/ src:

$(OBJDIR)/%.o: %.cpp $(DEPS) 
    $(CC) -c -o [email protected] $< 

我不明白爲什麼它不起作用。也許有更好的方法,但我也想知道爲什麼我的代碼在這種情況下不起作用。

作爲一個側面說明,makefile文件被另一個生成文件名爲:

#Main makefile for project 

#Get root compile directory 
ROOT_TOMATO = $(shell pwd) 
export ROOT_TOMATO 

All: 
    $(MAKE) -C src 
+1

如果您在第9行和第10行有問題,在提問之前應該從makefile中刪除有關EXDIR的任何信息。你的例子不是最小的。你的makefile中還有很多其他垃圾,與你的問題無關。 -1的問題。 – user31264

回答

3

如果你說

$(EXDIR)/tomato: $(OBJ) 

$(EXDIR)/tomato的先決條件是不$(OBJDIR)/settings.o$(OBJDIR)/tomato.o,但只是普通settings.otomato.o,正如你在OBJ中定義的那樣。因此,模式規則不會用於構建它們,並會使用隱式規則構建settings.otomato.o

你也可以使用

$(EXDIR)/tomato: $(OBJ:%=$(OBJDIR)/%) 

...或者設置OBJ以便它包含從一開始就這些路徑。

請注意,您的clean規則存在類似的問題,因此使用包含實際對象路徑的變量是明智的。您可以在$(EXDIR)/tomato先決條件和clean配方中使用它。

另請注意,內部Makefile的默認規則不是all,而是$(EXDIR)/tomato,因爲它是第一個用於特定目標的規則。這是一件好事, all規則將無法按預期工作,因爲它的先決條件是tomato,對此沒有規則,而不是$(EXDIR)/tomato。儘管如此,我懷疑你會想解決這個問題,並將all規則移到頂部。

+0

謝謝。你的答案確實有效。 – user3273814

0

Make是一種語言'保持簡單'是很好意見。這是一種簡單的事情很簡單的語言;硬件看起來像線噪聲。

請記住,Make是一種可執行的構建過程文檔 - 可讀性是一件好事。

我已經重寫你的Makefile,就像這樣

CXX=g++ 
OBJ=settings.o tomato.o 
TARGET=tomato 

%.o: %.cpp 
    $(CXX) -c -o [email protected] $< 


# default target 
$(TARGET): $(OBJ) 
    $(CXX) -o $(TARGET) $(OBJ) $(CFLAGS) 

tomato.o: settings.h 
settings.o: settings.h 

clean: 
    rm $(TARGET) *.o 

即:

  1. 這是常規使用CXX的宏C++編譯器,並留下CC C編譯器 - 這會促使任何人閱讀規則以跳到正確的結論。
  2. 保持%.o: %cpp規則簡單。所以,最終在當前目錄中有大量的*.o文件 - 很重要!把它們放在你的Mercurial/Git忽略文件中,然後繼續。你可以把它們放到另一個目錄中,@Wintermute顯示瞭如何做到這一點,但它需要更多的標點符號,並沒有真正獲益。
  3. 請注意我不需要使用任何$(VAR:sub=result)結構。它們很有用,但如果你使用太多,結果很快就變得不可讀。
  4. 不願意依賴%規則。在無動作規則(如tomato.osettings.o的依賴關係)中分別表示那些「對這些模塊沒有任何特殊要求」的文檔可以讓所有內容看起來更清晰。

一個複雜的makefile自動做一切是拖延(把它從我哦哥哥...)的好方法。

+1

這可能都是很好的建議,但與被問到的問題無關,即如何將目標文件放在單獨的目錄中。 – MadScientist

相關問題