Makefile 編譯問題解惑

.
|-- List
|   |-- List.c
|   |-- List.h
|   |-- obj   `
|   `-- Unitest
|       `-- main.c
|        -- Makefile
|-- Macro
|   `-- DataMacroDefine.h

1、$(OUTPUT):$(OBJS1) $(OBJS2) $(OBJS3) 寫法表示依賴三個OBJS的生成。 即首先生成$(OBJS1) $(OBJS2) $(OBJS3)子目標,再生成$(OUTPUT)
2、$(LIBCC) -c 表示只生成目標文件,不進行目標文件的鏈接。也就是.c(自動關聯同名的.h文件) 或者 .h 單獨進行編譯生成文件,當然不能執行。
   $(LIBCC) 表示生成目標文件,如果有必要,需要進行子目標文件的鏈接。
#echo $MAKE=make -w ##提示進入或者離開哪個目錄,有利於出錯問題的定位
INCLUDE= ../
INCLUDE_MACRO= ../../Macro
OBJ_PATH=./
OBJS1=$(OBJ_PATH)List.o
OBJS2=$(OBJ_PATH)main.o
OBJS3=$(OBJ_PATH)DataMacroDefine.o
OUTPUT=List
CC=gcc
CCFLAGS=$(COMPILE_FLAGS) $(DEF)
LIBCC=gcc 
COMPILE_FLAGS=-w -fPIC -rdynamic  
LIBCOMPILE_FLAGS=-w -fPIC -rdynamic  
DEF = -g 
LINKA=ar  
LDFLAGS= -cr 
#ALL定義段  
all:$(OUTPUT)
$(OUTPUT):$(OBJS1) $(OBJS2) $(OBJS3)
	$(LIBCC) $(CCFLAGS) $(OBJS3) $(OBJS1) $(OBJS2)  -o $(OUTPUT)
$(OBJS1):
	$(LIBCC) -c $(CCFLAGS) $(INCLUDE)/List.c -o $(OBJS1)
$(OBJS2):
	$(LIBCC) -c $(CCFLAGS) main.c -o $(OBJS2)
$(OBJS3):
	$(LIBCC) -c $(CCFLAGS) $(INCLUDE_MACRO)/DataMacroDefine.h -o $(OBJS3)
clean:
	rm -rf *.o $(OUTPUT)
上述編譯報錯:
gcc  -w -fPIC -rdynamic   -g  ./DataMacroDefine.o ./List.o ./main.o  -o List
./DataMacroDefine.o: file not recognized: File format not recognized
collect2: ld returned 1 exit status
make: *** [List] 錯誤9C f
使用 file DataMacroDefine.o 命令發現與其他兩個目標文件的輸出信息不同
file List.o 
List.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
file main.o
main.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
file DataMacroDefine.o 
DataMacroDefine.o: GCC precompiled header (version 013) for C
且如果Makefile改成如下形式編譯通過。
#ALL定義段  
all:$(OUTPUT)
$(OUTPUT):$(OBJS1) $(OBJS2) $(OBJS3)
	$(LIBCC) $(CCFLAGS) $(INCLUDE_MACRO)/DataMacroDefine.h $(OBJS1) $(OBJS2)  -o $(OUTPUT)
$(OBJS1):
	$(LIBCC) -c $(CCFLAGS) $(INCLUDE)/List.c -o $(OBJS1)
$(OBJS2):
	$(LIBCC) -c $(CCFLAGS) main.c -o $(OBJS2)
$(OBJS3):
	$(LIBCC) -c $(CCFLAGS) $(INCLUDE_MACRO)/DataMacroDefine.h -o $(OBJS3)
clean:
	rm -rf *.o $(OUTPUT)
==》 進一步修改,使用 -I (指定包含頭文件路徑)
INCLUDE= ../
INCLUDE_MACRO= -I ../../Macro/
OBJ_PATH=./
OBJS1=$(OBJ_PATH)List.o
OBJS2=$(OBJ_PATH)main.o
OUTPUT=List
CC=gcc
CCFLAGS=$(COMPILE_FLAGS) $(DEF)
LIBCC=gcc 
COMPILE_FLAGS=-w -fPIC -rdynamic  
LIBCOMPILE_FLAGS=-w -fPIC -rdynamic  
DEF = -g 
LINKA=ar  
LDFLAGS= -cr 
#ALL定義段  
all:$(OUTPUT)
$(OUTPUT):$(OBJS1) $(OBJS2)
	$(LIBCC) $(CCFLAGS) $(INCLUDE_MACRO) $(OBJS1) $(OBJS2)  -o $(OUTPUT)
$(OBJS1):
	$(LIBCC) -c $(CCFLAGS) $(INCLUDE)/List.c -o $(OBJS1)
$(OBJS2):
	$(LIBCC) -c $(CCFLAGS) main.c -o $(OBJS2)
clean:
rm -rf *.o $(OUTPUT)
==》 進一步修改,規範文件路徑
MY_PATH= ../
INCLUDE= -I ../../Macro/
OBJ_PATH=./obj/
OBJS1=$(OBJ_PATH)List.o
OBJS2=$(OBJ_PATH)main.o
OUTPUT=$(OBJ_PATH)List
CC=gcc
CCFLAGS=$(COMPILE_FLAGS) $(DEF)
LIBCC=gcc 
COMPILE_FLAGS=-w -fPIC -rdynamic  
LIBCOMPILE_FLAGS=-w -fPIC -rdynamic  
DEF = -g 
LINKA=ar  
LDFLAGS= -cr 
#ALL定義段  
all:$(OUTPUT)
$(OUTPUT):$(OBJS1) $(OBJS2)
	$(LIBCC) $(CCFLAGS) $(INCLUDE) $(OBJS1) $(OBJS2)  -o $(OUTPUT)
$(OBJS1):
	$(LIBCC) -c $(CCFLAGS) $(MY_PATH)List.c -o $(OBJS1)
$(OBJS2):
	$(LIBCC) -c $(CCFLAGS) main.c -o $(OBJS2)
clean:
	rm -rf $(OBJS1) $(OBJS2) $(OUTPUT)
==》 進一步修改,使用$<(自動匹配目標文件名,進行編譯輸出)
MY_PATH= ../
INCLUDE=-I ../ \
        -I ../../Macro/
OBJ_PATH=./obj/
OBJS=$(MY_PATH)List.o 
UNIT_OBJS=main.o
OUTPUT=$(OBJ_PATH)List
CC=gcc
CCFLAGS=$(COMPILE_FLAGS) $(DEF)
LIBCC=gcc 
COMPILE_FLAGS=-w -fPIC -rdynamic  
LIBCOMPILE_FLAGS=-w -fPIC -rdynamic  
DEF = -g 
LINKA=ar  
LDFLAGS= -cr 
#ALL定義段  
all:$(OUTPUT)
$(OUTPUT):$(OBJS) $(UNIT_OBJS)
	$(LIBCC) $(CCFLAGS) $(INCLUDE) $(OBJS) $(UNIT_OBJS) -o $(OUTPUT)
$(OBJS):%o:%c
	$(LIBCC) -c $(CCFLAGS) $< -o $(OBJS)
$(UNIT_OBJS):%o:%c
	$(LIBCC) -c $(CCFLAGS) $< -o $(UNIT_OBJS)
clean:
	rm -rf $(OBJS) $(UNIT_OBJS) $(OUTPUT)
==》 進一步修改,使用$@(依次取出目標文件名,進行編譯輸出)
MY_PATH= ../
INCLUDE=-I ../ \
        -I ../../Macro/
OBJ_PATH=./obj/
OBJS=$(MY_PATH)List.o 
UNIT_OBJS=main.o
OUTPUT=$(OBJ_PATH)List
CC=gcc
CCFLAGS=$(COMPILE_FLAGS) $(DEF)
LIBCC=gcc 
COMPILE_FLAGS=-w -fPIC -rdynamic  
LIBCOMPILE_FLAGS=-w -fPIC -rdynamic  
DEF = -g 
LINKA=ar  
LDFLAGS= -cr 
#ALL定義段  
all:$(OUTPUT)
$(OUTPUT):$(OBJS) $(UNIT_OBJS)
	$(LIBCC) $(CCFLAGS) $(INCLUDE) $(OBJS) $(UNIT_OBJS) -o $@
$(OBJS):%o:%c
	$(LIBCC) -c $(CCFLAGS) $< -o $@
$(UNIT_OBJS):%o:%c
	$(LIBCC) -c $(CCFLAGS) $< -o $@
clean:
	rm -rf $(OBJS) $(UNIT_OBJS) $(OUTPUT)
</pre><pre code_snippet_id="461598" snippet_file_name="blog_20140831_1_4410746" name="code" class="cpp">.
|-- List
|   |-- Hello.c
|   |-- Hello.h
|   |-- List.c
|   |-- List.h
|   |-- obj   `
|   `-- Unitest
|       `-- main.c
|        -- Makefile
|-- Macro
|   `-- DataMacroDefine.h





==》 進一步修改,合併$(OBJS) $(UNIT_OBJS) 爲$(OBJS)

MY_PATH= ../INCLUDE=-I ../ \ -I ../../Macro/OBJ_PATH=./obj/OBJS1=$(MY_PATH)List.o $(MY_PATH)Hello.oOBJS=$(OBJS1) main.oOUTPUT=$(OBJ_PATH)ListCC=gccCCFLAGS=$(COMPILE_FLAGS) $(DEF)LIBCC=gcc COMPILE_FLAGS=-w -fPIC -rdynamic LIBCOMPILE_FLAGS=-w -fPIC -rdynamic DEF = -g LINKA=ar LDFLAGS= -cr #ALL定義段 all:$(OUTPUT)$(OUTPUT):$(OBJS)$(LIBCC) $(CCFLAGS) $(INCLUDE) $(OBJS) -o $@$(OBJS):%o:%c$(LIBCC) -c $(CCFLAGS) $< -o $@clean:rm -rf $(OBJS) $(OUTPUT)

==》 進一步修改, 對變量使用“+=” 進行賦值,不會覆蓋

MY_PATH= ../INCLUDE +=-I ../ \ -I ../../Macro/OBJ_PATH=./obj/OBJS=$(MY_PATH)List.o $(MY_PATH)Hello.oOBJS += main.oOUTPUT=$(OBJ_PATH)ListCC=gccCCFLAGS +=$(COMPILE_FLAGS) $(DEF)LIBCC=gcc COMPILE_FLAGS=-w -fPIC -rdynamic LIBCOMPILE_FLAGS=-w -fPIC -rdynamic DEF = -g LINKA=ar LDFLAGS= -cr .SUFFIXES: .cpp .c .h .cpp.o: $(CC) $(CCFLAGS) $(INCLUDE) -c $< -o $@ .c.o: $(CC) $(CCFLAGS) $(INCLUDE) -c $< -o $@#ALL定義段 all:$(OUTPUT)$(OUTPUT):$(OBJS) $(LIBCC) $(CCFLAGS) $(INCLUDE) $(OBJS) -o $@clean: rm -rf $(OBJS) $(OUTPUT)

.

|-- List


|   |-- Hello.c|   |-- Hello.h|   |-- List.c|   |-- List.h|   |-- obj|   |   `-- Makefile|   `-- Unitest|       `-- main.c|-- Macro|   `-- DataMacroDefine.h




==》 進一步修改,調整路徑並使用VPATH 解決多路徑問題,路徑變量可用冒號“:” 隔開
MY_PATH= ../
UNIT_PATH= ../Unitest
INCLUDE +=-I ../ \
          -I ../Macro/
OBJS=List.o Hello.o
OBJS += main.o
VPATH = $(MY_PATH):$(UNIT_PATH)
OUTPUT=List
CC=gcc
CCFLAGS +=$(COMPILE_FLAGS) $(DEF)
LIBCC=gcc 
COMPILE_FLAGS=-w -fPIC -rdynamic  
LIBCOMPILE_FLAGS=-w -fPIC -rdynamic  
DEF = -g 
LINKA=ar  
LDFLAGS= -cr 
.SUFFIXES: .cpp .c .h  
.cpp.o:  	
<span style="white-space:pre">	</span>$(CC) $(CCFLAGS) $(INCLUDE) -c $< -o $@   
.c.o:
	$(CC) $(CCFLAGS) $(INCLUDE) -c $< -o $@

#ALL定義段  

all:$(OUTPUT)$(OUTPUT):$(OBJS)

	$(LIBCC) $(CCFLAGS) $(INCLUDE) $(OBJS)  -o $@
clean:
	rm -rf $(OBJS) $(OUTPUT)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章