Linux开发——Makefile基础和通用模板

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_25490573/article/details/102023098

目录

 

前言

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

猜你喜欢

转载自blog.csdn.net/qq_25490573/article/details/102023098