您的位置:首页 > 运维架构 > Linux

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

2014-07-06 13:43 211 查看
基本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
#                                 2014-8-26
#                  EMAIL: gjianw217@163.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
#                                 2014-8-26
#                  EMAIL: gjianw217@163.com
###########################################
OBJ=\
fun1.o
DEP=\
fun1.h
SRC=\
fun1.cpp
$(OBJ):$(SRC)
@echo "fun1 fun1"
g++ -c $< $(DEP)

###########################################
#Makefile fun2
#                            By Guo Jianwei
#                                 2014-8-26
#                  EMAIL: gjianw217@163.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)


View Code
完整的测试代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐