天天看點

gcc與Makefile使用執行個體

有檔案夾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: (DIRO​BJ)/{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)