2016-10-18 21 views
0

我是一個通用make的noob,所以提前致歉。如果文件在窗口中被更改,GNU不會檢測到

我有一個文件夾結構,其中foo.cpp位於項目的根目錄中,所有其他.cpp文件位於另一個文件夾中的一個和所有標頭中。每當我改變一些東西,只是說一切都是最新的。

Windows系統,10

的代碼是從

我的makefile:

OBJS = foo.o bar.o 
CC = g++ 
INCLUDE_PATHS = -IC:\Mingw_libs\include\SDL2 
LIBRARY_PATHS = -LC:\Mingw_libs\lib -Iheaders 
COMPILER_FLAGS = -std=c++11 
LINKER_FLAGS = -lmingw32 -lSDL2main -lSDL2 -lSDL2_image 

OUTPUTFILE = main 

all: $(OBJS) 
    $(CC) $(OBJS) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(LINKER_FLAGS) -o $(OUTPUTFILE) 

clean: 
    rm *.o 
    rm *.exe 

foo.o: 
    $(CC) -c foo.cpp $(INCLUDE_PATHS) $(COMPILER_FLAGS) $(LIBRARY_PATHS) $(LINKER_FLAGS) 

bar.o: 
    $(CC) -c sources/bar.cpp $(INCLUDE_PATHS) $(COMPILER_FLAGS) $(LIBRARY_PATHS) $(LINKER_FLAGS) 

回答

0

您需要將依賴項添加到您的目標。使有語法

target : prerequisite 
    command 

所以你的情況:

foo.o: foo.cpp 
    $(CC) -c $< $(INCLUDE_PATHS) $(COMPILER_FLAGS) $(LIBRARY_PATHS) $(LINKER_FLAGS) 

同樣與bar

$<是第一要義的佔位符。所以你不必輸入foo.cpp兩次。

您可以在這裏結帳更多自動變量:https://www.gnu.org/software/make/manual/make.html#Automatic-Variables

0

您應該聲明目標的依賴這樣的:

foo.obj: foo.c 
    .... 

以其他方式不會現在至少需要檢查文件的變化。

+0

謝謝。這似乎奏效了。 –

0

您的makefile對foo.obar.o沒有依賴關係。

all: $(OBJS) 
    $(CC) $(OBJS) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(LINKER_FLAGS) -o $(OUTPUTFILE) 

說:all取決於$(OBJS)。因此,當$(OBJS)中的一個文件發生更改時,將執行該步驟。

這是說foo.o取決於什麼:

foo.o: 
    $(CC) -c foo.cpp $(INCLUDE_PATHS) $(COMPILER_FLAGS) $(LIBRARY_PATHS) $(LINKER_FLAGS) 

您需要添加依賴性:

foo.o: foo.cpp 
    $(CC) -c foo.cpp $(INCLUDE_PATHS) $(COMPILER_FLAGS) $(LIBRARY_PATHS) $(LINKER_FLAGS) 

注意,:後的空間通常需要是一個標籤,而不是實際的空間( S)。