有檔案夾src放下面檔案
hello_1.c hello.c main.c
有檔案夾include放下面檔案
hello_1.h hello.h
腳本如下:
1 NAME= main
2 DIR_INC=./include
3 DIR_SRC=./src
4 DIR_OBJ=./obj
5 DIR_BIN=./bin
6
7 INCLUDE=-I$(DIR_INC)
8 TARGET=$(DIR_BIN)/$(NAME)
9
10 SRC=$(wildcard ${DIR_SRC}/*.c)
11 OBJS=$(SRC:$(DIR_SRC)/%.c=$(DIR_OBJ)/%.o)
12
13 $(TARGET):$(OBJS)
14 @echo 'depend file "$^" ...'
15 gcc -o $(TARGET) $(OBJS)
16 $(DIR_OBJ)/%.o:${DIR_SRC}/%.c
17 @echo 'compiling object file "[email protected]" ...'
18 gcc -c -o [email protected] $<
19 clean:
20 rm -fr $(OBJS) $(TARGET);
上面代碼可以直接運作,其基本原理:
( T A R G E T ) : (TARGET): (TARGET):(OBJS)依賴所有.o檔案,并且生成目标執行檔案$(TARGET)
( D I R O B J ) / (DIR_OBJ)/%.o: (DIROBJ)/{DIR_SRC}/%.c 所有.o檔案依賴于對應的.c檔案,并且生成對應的.o檔案。
- Makefile的規則
target … : prerequisites …
command//記住此處必須使用tab,不能使用空格
- gcc
gcc -o hello hello.c -I /home/hello/include-L /home/hello/lib –lworld
I目錄作為第一個尋找頭檔案的目錄,
L表示将/home/hello/lib目錄作為第一個尋找庫檔案的目錄,
gcc -lm 的選項,C代碼調用math.h中的函數有問題,如sqrt函數。若如sqrt(3.0)則可以編譯通過并運作正常,若如sqrt(n),這裡n是定義好的double型變量,則不能編譯通過,錯誤資訊為:undefined reference to ‘sqrt’。
-lm選項告訴編譯器,我們程式中用到的數學函數要到這個庫檔案裡找.
-o 輸出可執行檔案
-c 編譯生成目标檔案
-g 輸出調試資訊
-O2 編譯器優化級别 1-3
-Wall 警告選項 輸出警告資訊
-l 緊接着連結庫 lpthread
-L 指定連結庫的路徑
-I 頭檔案路徑
-shared 編譯成動态連結庫
注意-c隻是生成目标檔案,而-o直接回生成可執行檔案
.c.o:
這句話的意思就是 %.o : %.c
也就是說,所有的.o檔案,依賴于對應的.c檔案
src=$(wildcard .c ./sub/.c)
dir=$(notdir $(src))
obj= ( p a t s u b s t (patsubst %.c,%.o, (patsubst(dir) )
wildcard把 指定目錄 ./ 和 ./sub/ 下的所有字尾是c的檔案全部展開。
notdir把展開的檔案去除掉路徑資訊
patsubst把$(dir)中的變量符合字尾是.c的全部替換成.o
符号意義:
$(Files),取File變量的值。
[email protected] 目标檔案
$^ 全部依賴
$< 第一個依賴
$? 第一個變化的依賴
下面放一個g++編譯的通用腳本:
NAME= cache
DIR_INC=./include
DIR_SRC=./src
DIR_OBJ=./output/obj
DIR_BIN=./output/bin
#CC = gcc
CC = g++
## debug flag
DBG_ENABLE = 0
INCLUDE=-I$(DIR_INC)
## debug for debug info, when use gdb to debug
ifeq (1, ${DBG_ENABLE})
CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1
endif
## get all include path
CFLAGS += $(foreach dir, $(DIR_INC), -I$(dir))
CFLAGS += -std=c++11
TARGET=$(DIR_BIN)/$(NAME)
#SRC = $(wildcard ${DIR_SRC}/*.c)
SRC += $(wildcard $(DIR_SRC)/*.cpp)
#OBJS = $(SRC:$(DIR_SRC)/%.c=$(DIR_OBJ)/%.o)
OBJS +=$(SRC:$(DIR_SRC)/%.cpp=$(DIR_OBJ)/%.o)
$(TARGET):$(OBJS)
@echo 'depend file "$^" ...'
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
$(DIR_OBJ)/%.o:${DIR_SRC}/%.cpp
@echo 'compiling object file "[email protected]" ...'
$(CC) $(CFLAGS) -c -o [email protected] $<
clean:
rm -fr $(OBJS) $(TARGET);
rm -fr $(DIR_OBJ)/* $(DIR_BIN)/*;
test:
@echo $(SRC)
@echo $(OBJS)