Linux開發——Makefile基礎和通用模板

目錄

 

前言

c語言編譯過程:

gcc命令:

debug宏定義快捷方法:

Makefile

Makefile多文件通用格式:


前言

cat  /etc/*release  查看系統版本信息

更新源文件  sudo gedit /etc/apt/sources.list

安裝ssh命令 sudo apt-get install openssh

c語言編譯過程:

                       1.預編譯(生成.i文件)  命令# gcc -E -o hello.i hello.c    作用: 頭文件展開和.c文件合併

                       2.轉匯編(.s)命令# gcc -S -o hello.s hello.i   作用:

                       3.編譯(.o)命令# gcc -C -o hello.o hello.s  作用:彙編轉二進制機器命令

                       4.鏈接(elf文件) 命令# gcc -o hello.elf hello.o  作用:將若干的.o文件鏈接到一起

gcc命令:

              -D   加debug  使用方法:gcc -DDEBUG=1 -o hello hello.c

              -I  指定include文件目錄,

              -L  指定鏈接庫目錄   -l指定該目錄下的庫名稱 

              -O 優化指令  -O1 1級優化 -O3 3級優化

              -Wall  嚴格警告,有警告不能執行通過

debug宏定義快捷方法:

#define DEBUG(1)
#if DEBUG
	#define DEBUG_LOG(fmt,args...) do {printf("[*]xxx:<%s>:" fmt "\n" \
						,__func__, ##args); }while(false)
#else
	#define DEBUG_LOG(...)do {}while(false)
#endif

Makefile

組成:顯式規則  隱式規則  變量定義  文件指示  註釋

基本格式:

目標:依賴

        命令

hello.gcc:hello.c
        gcc -o hello.gcc hello.c

變量:  引用方式: $(變量名)

         object := hello.o haha.o

         object += hehe.o

尾目標   .PHONY:          執行方式:make clean

.PHNOY:
clean:
    rm -rf *.o hello.gcc

通配符                   %(任意一個)  *(所有)  ?(匹配一個)

                              $@ 目標文件  $^ 依賴文件  $< 第一個依賴文件

%.o:%.c
    gcc -c $^ -o $@

增加函數後的通用格式

FILESRC = $(wildcard *.c)
OBJ_DEP = $(patsubst %.c,%.o,$(FILESRC))
TARGET = hello.gcc
CC       = gcc
CCFLASH  = -o
LIBS     = -L/usr/lib
INCLUDE  = -I/usr/include
DEFINE   = -DDEBUG
OPTIMIZE = -O0


$(TARGET):$(OBJ_DEP)
        $(CC) $(INCLUDE) $(LIBS) $(DEFINE) $(OPTIMIZE) $(CCFLASH) $@ $^

.PHONY:
clean:
        rm -rf $(object) $(TARGET)

Makefile文件執行shell腳本文件

make -c ./ f $(shell pwd)/makefile.bluid

Makefile多文件通用格式:

根目錄下的Makefile

TARGET:生成的目標文件名

cc 編譯器   。。。。。。

TARGET   = hello
CC       = gcc
CCPARA   = -g -o
LD       = ld
LIBSDIR  = -L/usr/local
LIBS     =
INCLUDE  = -I$(shell pwd)/include/
DEFINE   = -DDEBUG
OPTIMIZE = -O0
TOPDIR   = $(shell pwd)

export CC CCPARA LD LIBSDIR LIBS INCLUDE DEFINE OPTIMIZE TOPDIR

obj-y += main.o
obj-y += tool_mode/
obj-y += agreement/

all:
        make -C ./ -f $(TOPDIR)/Makefile.build
        $(CC) $(INCLUDE) $(LIBSDIR) $(DEFINE) $(OPTIMIZE) -o $(TARGET) built-in.o $(LIBS)
#       objcopy --only-keep-debug $(TARGET) $(TARGET).Symbols
#       objcopy --strip-debug $(TARGET) $(TARGET).Release
#       strip $(TARGET).Release
#       rm -f $(TARGET)



clean:
        rm -rf $(shell find -name "*.o")
        rm -rf $(TARGET)
#       rm -f $(TARGET).Symbols $(TARGET).Release
distclean:
        rm -f $(shell find -name "*.o")
        rm -f $(shell find -name "*.o")
        rm -f $(TARGET)                      
#       rm -f $(TARGET).Symbols $(TARGET).Release

根目錄下的Makefile.build

PHONY := __build
__build:

obj-y :=
subdir-y :=

include Makefile

#obj-y: a.o b.o c/ d/

__subdir-y := $(patsubst %/,%,$(filter %/,$(obj-y)))
subdir-y += $(__subdir-y)

#c/built-in.o d/built-in.o
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)

#a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_file))

ifneq ($(dep_files),)
        include $(dep_files)
endif

PHONY += $(subdir-y)

__build : $(subdir-y) built-in.o

$(subdir-y):
        make -C $@ -f $(TOPDIR)/Makefile.build

built-in.o : $(cur_objs) $(subdir_objs)
        $(LD) -r -o $@ $^

dep_file = [email protected]

%.o : %.c
        $(CC) $(INCLUDE) $(LIBSDIR) $(LIBS) $(DEFINE) $(OPTIMIZE) -c $(CCPARA) $@ $<

.PHONY : $(PHONY)
                  

每個文件夾下的文件需要在Makefile中添加

obj-y += haha.o

 

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