基本Makefile
假设现在有3个文件,file2.h是函数声明,file2.c是函数定义,文件file1.c调用file2.c中的函数。则Makefile文件的编写如下:

helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld

2 自动推导

helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
%.o:%.c
gcc -c $< -o $@
clean:
rm -rf *.o helloworld

3 变量使用

CC= gcc
CFLAGS= -I/home/mymakefile/include
LDFLAGS= -L/home/mymakefile/lib
LIBS = -lsocket -lmath
CFLAGS= -g -Wall -O2
#PATH = /path/to/bin
SRCS=file1.c file2.c
OBJS=file1.o file2.o
TARGET=helloworld $(TARGET):$(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(TARGET)
%.o:%.c
$(CC) -c $< -o $@
clean:
rm -rf $(OBJS) $(TARGET)

4 特殊符号使用
这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名
所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在.

自动化变量$?代表依赖文件列表中被改变过的所有文件。
自动化变量$^代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。
自动化变量$@代表规则的目标。
自动化变量$<代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。
自动化变量$(@D)

5 关键词使用

wildcard
subst
  用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO
TARGETS = 111.cpp 222.cpp 333.cpp
OTARGETS= $(subst cpp,o,$(TARGETS))
LTARGETS= $(subst cpp,lo,$(TARGETS))

patsubst <pattern>,<replacement>,<text> )
(patsubst %.c,%.o,x.c.c bar.c)

把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”

$(wildcard PATTERN...) 。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。

可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。

filter

6 选项使用

7 进入子目录

在学习Makefile过程中,一般是Makefile文件和源码、头文件存放在同一个目录中,但对于我们实际的工作过程中,通常是分开的。分开主要有两种方式,一种是根据模块,一种是根据文件的不同。如下面两图:

     

对于第一种,按照文件类型进行划分代码,只需要一个Makefile文件就可以,具体的形式如下所示:

 ###########################################
# Makefile
# By Guo Jianwei
# --
# EMAIL: gjianw217@.com
###########################################
NAME = app
BIN = bin/debug/$(NAME) CC = gcc
CXX = g++ LINKOPT = -O3
FLAGS = $(LINKOPT) LIBS =
CFLAGS = $(LIBS)
CXXFLAGS = $(LIBS) -g INCS = -I$(INCPATH)/common\
-I$(INCPATH)/third-party SRCPATH = src/
INCPATH = include SRCS = $(shell find $(SRCPATH) -name '*.c' -o -name '*.cpp' \
-o -name '*.cc' \
| grep -v 'socket') OBJS = $(filter %.o,$(SRCS:%.c=%.c.o))
OBJS += $(filter %.o,$(SRCS:%.cpp=%.cpp.o))
OBJS += $(filter %.o,$(SRCS:%.cc=%.cc.o)) .PHONY: clean print all: print $(BIN) print:
@echo "===================================================="
@echo " $(BIN)"
@echo "====================================================" $(BIN): $(OBJS)
$(CXX) $(FLAGS) -o $@ $^ %.c.o: %.c
$(CXX) $(CFLAGS) $(INCS) -o $@ -c $^ %.cpp.o: %.cpp
$(CXX) $(CXXFLAGS) $(INCS) -o $@ -c $^ %.cc.o: %.cc
$(CXX) $(CXXFLAGS) $(INCS) -o $@ -c $^ clean:
rm -rf $(BIN) $(OBJS)

对于第二种,按照功能进行组织代码,在每个功能模块中,都需要包含一个Makefile文件,具体的形式如下:

 #Makefile
###########################################
# Makefile
# By Guo Jianwei
# --
# EMAIL: gjianw217@.com
###########################################
OBJ=fun1/fun1.o\
fun2/fun2.o\
main.o
DEL=fun1/fun1.h\
fun2/fun2.h
SRC=$(patsubst %.o,%.cpp,$(OBJ))
TARGET=app
.PHONY:all fun1 fun2 app
all:fun1 fun2 app
fun1:
$(MAKE) -C fun1
fun2:
$(MAKE) -C fun2
$(TARGET):$(OBJ)
g++ -o $(TARGET) $(OBJ) $(DEL)
%.o:%.cpp
g++ -c $< $(DEL)
clean:
rm $(OBJ) $(TARGET) ###########################################
#Makefile fun1
# By Guo Jianwei
# --
# EMAIL: gjianw217@.com
###########################################
OBJ=\
fun1.o
DEP=\
fun1.h
SRC=\
fun1.cpp
$(OBJ):$(SRC)
@echo "fun1 fun1"
g++ -c $< $(DEP) ###########################################
#Makefile fun2
# By Guo Jianwei
# --
# EMAIL: gjianw217@.com
###########################################
OBJ=fun2.o
DEP=$(patsubst %.o,%.h,$(OBJ))
SRC=$(patsubst %.o,%.cpp,$(OBJ))
CXX=g++
CFLAGS= -O2 -c -Wall -g
#$(OBJ):$(SRC)
# $(CXX) $(CFLAGS) $<
$(OBJ):%.o:%.cpp
$(CXX) $(CFLAGS) $< $(DEP)

完整的测试代码

1. Linux驱动开发之开篇--Makefile的更多相关文章

  1. Linux驱动开发之开篇--HelloWorld

    Linux驱动的编写,大致分为两个过程,第一个过程为测试阶段,即为某一具体的设备,添加必要的驱动模块,为了节省编译时间,需要将代码单独放在一处,在编译时,只需要要调用内核的头文件即可:第二个过程为布置 ...

  2. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  3. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  4. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  5. s3c6410 Linux 驱动开发环境搭建

    s3c6410 Linux 驱动开发环境搭建 -- 既然你是做Linux开发的,你还用虚拟机? 非常多人都在win下做开发,于是SD_writer.exe之类的烧写工具"大行其道" ...

  6. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  7. 【转】linux驱动开发的经典书籍

    原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...

  8. Linux驱动开发 -- 打开dev_dbg()

    Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...

  9. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

随机推荐

  1. angular 项目回顾

    从学习angular,到实际项目开发不到一周,完全是边写边学呀,都是为了项目,已使用angular 开发了两个项目了,有些技术当时只是会用,都没好好回顾一下,现在有时间回顾一下,项目中用到的一些指令, ...

  2. Windows Azure 微软公有云体验(一) 网站、SQL数据库、虚拟机

    Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发.运行.维护带来什么样的新体验呢? Windows Azur ...

  3. 24小时学通Linux内核--内核探索工具类

    寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...

  4. 虚拟机 VirtualBox 自制帮助文档

    初学 VirtualBox ,网络上教程很多,图片一张一张的费流量,讲得又比较散,于是花了一下午制作了此 CHM 帮助文档. 下载:(图片另存为--重命名为 RhinoC.rar --解压缩)

  5. RTC之初始化

    RTC为了避免初始化一般有3中方法: 一给MCU的VBAT供电,利用MCU的后备寄存器保存已经设置过时间的标志值,RTC初始化时先查询寄存器值如果是已经设置过则不用初始化设置时间 二 当不给VBUAT ...

  6. [Jquery] 获取地址栏参数的方法 备忘

    <script type="text/javascript"> (function ($) { $.getUrlParam = function (name) { va ...

  7. VHD轻松实现双系统

    VHD 是微软虚拟磁盘文件.   VHD(Microsoft Virtual Hard Disk format). 目前可以使用Microsoft Virtual PC 2007 and Micros ...

  8. JAVA UDP网络编程学习笔记

    一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...

  9. 第一篇、jQuery的使用

    1.jquery 的优势 >轻量级 >强大的选择器 >出色的DOM操作封装 >完善的事件和事件对象的兼容机制 >完善的ajax >不污染全局变量($可以随时交出控制 ...

  10. UIProgressView[进度条][一般型];UIStepper步数器][事件驱动型]

    ////  ViewController.m//  ProgressAndSteper////  Created by hehe on 15/9/21.//  Copyright (c) 2015年 ...