Linux中Makefile万能写法

对于linux系统中使用gcc进行编译:

# 列出当前目录下所有*.c文件
SRC := $(wildcard *.c)

# 将所有*.c文件转为*.o文件
OBJ := $(patsubst %.c, %.o, $(SRC))

# 指定编译器
CC = gcc

# 指定链接器
CCLINK = g++

# 指定编译属性
CFLAGS = -g -Wall

# 指定编译输出的可执行程序名称
OUTNAME := helloworld

all: $(OBJ)
    $(CCLINK) $(CFLAGS) $^ -o $(OUTNAME)
    
$(OBJ): %.o:%.c
    $(CC) $(CFLAGS) -c $^ -o $@
    
.PHONY:clean
clean:
    rm *.o $(OUTNAME)

对于嵌入式linux使用交叉编译器进行编译:

SRC := ${wildcard *.c}
OBJ := ${patsubst %.c, %.o, $(SRC)}

CC = arm-linux-gcc
CCLINK = arm-linux-ld
CFLAGS = -g -c -Wall

all: $(OBJ)
    $(CCLINK) -Wall $^ -o all.bin
    
$(OBJ): %.o:%.c
    $(CC) $(CFLAGS) $^ -o $@
    
.PHONY:clean
clean:
    rm *.o all all.bin

对于linux编译模块:

# 指定模块名称
obj-m         := helloworld.o

# 指定内核源码目录
KDIR          := /lib/modules/$(shell uname -r)/build

# 指定将编译输出到当前目录
PWD           := $(shell pwd)

all:
    make -C $(KDIR) M=$(PWD) modules
    
.PHONY:clean
clean:
    make -C $(KDIR) M=$(PWD) modules clean

对于嵌入式linux编译模块:

# 指定模块名称
obj-m         := helloworld.o

# 指定编译平台
ARCH          := arm

# 指定交叉编译器
CROSS_COMPILE := arm-linux-

# 指定内核源码目录
KDIR          := /opt/embeded/dts-demo/linux-4.0.1

# 指定将编译输出到当前目录
PWD           := $(shell pwd)

all:
    make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules
    
.PHONY:clean
clean:
    make -C $(KDIR) M=$(PWD) modules clean

————————————————
 

你可能感兴趣的:(【Linux】)