示例3:生成动态库
# filename: Makefile for dynamic lib
#
# Authors: qiujie
# Version: 1.0
SOURCES= $(wildcard src/*.c)
OBJS = $(patsubst src/%.c, out/%.o, $(SOURCES))
TARGET = out/libapp.so
#PREFIX_BIN = /usr/local/bin
CC = gcc
AR = ar
CFLAGS = -g –Wall
INCLUDES = -I.
LIBS = -lpthread
LDFLAGS = -L. –shared - fPIC
vpath %.o out
vpath %.c src
vpath %.h include
.PHONY: all
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) –o $@ $^
%.o:%.c
$(CC) -c $< -o $@ $(INCLUDES) $(CFLAGS)
.PHONY:clean
clean:
rm -f $(OBJS)
rm -f $(TARGET)
说明:只有LDFLAGS多了一些相关参数
2.内核模块的makefile例子
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files
and target modules are listed here.
module1-objs := file1.o file2.o
module2-objs := file3.o
obj-m := module1.o
obj-m += module2.o
else
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
其实这个makefile文件被执行了两次,是通过ifneq,else来实现的。首次进入makeflie文件,由于KERNELRELEASE变量还没有被设置,所以进入到else部分:
1)make被参数化成$(MAKE),来加载一些内核构造的特殊用法;
2)-C改变当前目录的位置,该位置有内核顶层的makefile文件;
3)M=选项让makefile构造modules目标之前返回到先前的模块目录,以便第二次读取makefile
当第二次进入该makeflie文件,KERNELRELEASE变量已经被设置,所以进入到ifneq部分。通过obj-m设置了要编译模块及相关的依赖文件,最后内核的$(MAKE)开始真正地构造内核。
3.自动生成makefile文件
主要是利用autoscan,aclocal,autoconf,automake这几个命令来产生,具体操作见参考资料3。
参考资料
1.《LINUX设备驱动程序》第二章介绍了如何在内核树之外编译模块
2.GNU make手册
3. http://hi3ms.huawei.com/hi/blog/56637_57952.html
阅读(1615) | 评论(0) | 转发(0) |