2013-08-27 116 views
1

謝謝!我現在已經更新了我的makefile。 .o在src目錄中創建。 這裏是makefile和輸出。 makefile會引發錯誤,因爲所有的.o都是在src文件夾中創建的。我不知道爲什麼?我對Makefile很感興趣,請耐心等待我的愚蠢問題。makefile在src目錄中創建目標文件而不是對象文件夾

# This is the Vpath; as my source directory is in the src folder - all the .c files 
#folder structure 
#Gif_Utility 
#-->src/*.c 
#-->include/*.h 
VPATH = src:include:objects 
CFLAGS = -I ./include -g -Wall -DDEBUG 

OBJS =./objects 
# Look at the CFLAGS here; it has -DDEBUG because in my code, I have #ifdef DEBUG 
# Look at the CFLAGS here; -Wall : To generate all the compiler warnings. 
# include is required as my compilation depends on the .h files. 

# The LD flags to link the shared objects 
#LDFLAGS= 
#in my mini-project, I am using maths library, Thus, I have lm. 
# lc to link my main function with crt1.o 

#what is the compiler, am I using. 
#This is a good practice since I can modify these flags when cross-compiling. 
cc= gcc 

#PATH for the LIBS 
#This might be useful while cross-compiling. 
LIBS= -lm -lc 

target: $(patsubst %.c,%.o,$(wildcard ./src/*.c)) 
    @echo "making target" 
    @mkdir -p ./objects 
    $(cc) $(patsubst ./src/%.c,./objects/%.o,$(wildcard ./src/*.c)) $(LIBS) -o gif 


./objects/%.o: ./src/%.c 
    @echo "making objects now" 
    $(cc) $(CFLAGS) $(LDFLAGS) -c $< -o [email protected] 


#It is always better to write a PHONY rule for a rules like clean. 
#It may happen that in source sandbox, you have a clean file. This may invoke the clean file. 
#In order to prevent invoking a clean file during make clean; We give this general rule as PHONY 
#PHONY tells the MAKEFILE that there is a rule clean, not a file called clean. 
#Generally use PHONY for all, install, clean, distclean, 
.PHONY: clean 
clean: 
    @echo "cleaning everything" 
    @rm -f *.o 
    @rm -f gif 
    @echo "clearning .o from src" 
    @rm -f ./src/*.o 
    @rm -f ./objects/*.o 


$make target 

cc -I ./include -g -Wall -DDEBUG -c -o src/sysm.o src/sysm.c 
cc -I ./include -g -Wall -DDEBUG -c -o src/x86_main.o src/x86_main.c 
src/x86_main.c:11:9: warning: second argument of ‘main’ should be ‘char **’ [-Wmain] 
src/x86_main.c: In function ‘main’: 
src/x86_main.c:16:9: warning: implicit declaration of function ‘display_init’ [-Wimplicit-function-declaration] 
src/x86_main.c:19:9: warning: implicit declaration of function ‘Gif_Read’ [-Wimplicit-function-declaration] 
making target 
gcc ./objects/gif_display.o ./objects/gif_lzw.o ./objects/gif_read.o ./objects/sysm.o ./objects/x86_main.o -lm -lc -o gif 
gcc: error: ./objects/gif_display.o: No such file or directory 
gcc: error: ./objects/gif_lzw.o: No such file or directory 
gcc: error: ./objects/gif_read.o: No such file or directory 
gcc: error: ./objects/sysm.o: No such file or directory 
gcc: error: ./objects/x86_main.o: No such file or directory 
make: *** [target] Error  

回答

2

你需要修正你的patsubst更改文件名的目錄部分以及後綴:

$(patsubst ./src/%.c,./objects/%.o,$(wildcard ./src/*.c)) 

您還有其他問題,在你的makefile太大,例如這個目標有錯誤的前提:

./objects/%.o: %.c 

源文件應該是這樣的./src/%.c

而對於該目標的規則是錯誤的,它輸出到./objects/[email protected]這將擴大到像./objects/./objects/x86_main.o

+0

'/objects /',而不是'/ objs /' –

+0

@DidierTrosset,修正了,謝謝 –

+0

這裏有一個問題。 cc -I ./include -g -Wall -DDEBUG -c -o src/x86_main.o src/x86_main.c。基本上,它是在src文件夾中創建一個對象。 –

相關問題