Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287311
  • 博文数量: 57
  • 博客积分: 1764
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-09 18:14
文章分类

全部博文(57)

文章存档

2012年(24)

2011年(33)

分类: LINUX

2011-11-18 11:40:50

示例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) |
0

上一篇:Makeflie模板(一)

下一篇:内联汇编

给主人留下些什么吧!~~