原创:https://blog.csdn.net/ndzjx/article/details/88896170
makefie
默认make命令 会找makefile或Makefile, 如果自己定义了不同的文件名,执行时用:
make -f mymakefile
$? 列出当前目标所依赖的文件列表中比当前目标文件还要新的文件。
$@ 当前目标文件
$< 当前依赖文件的名字
$* 不包括后缀名的当前依赖文件的名字
特殊字符:
-: 告诉make 命令忽略所有错误。
@:告诉make 在执行某条命令前不将该命令本身输出到标准输出
还可以增加clean/ install选项
all: myapp
# Which compiler
CC = gcc
# Where to install
INSTDIR = ~/bin
# Where are include files kept
INCLUDE = .
# Options for development
CFLAGS = -g -Wall -ansi
# Options for release
# CFLAGS = -O -Wall -ansi
myapp: main.o 2.o 3.o
$(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
clean:
-rm main.o 2.o 3.o
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
定义新的规则:如将.cpp文件转换为.o文件
.SUFFIXES: .cpp
.cpp.o:
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
make有很多内置规则:如从.c 文件得到.a文件
.c.a:
$(CC) -c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $*.o
宏$(AR)和$(ARFLAGS) 默认为 ar 和 选项rv
基于这些内置规则,Makefile可以将制作目标的规则去掉,指制定依赖关系:
all: myapp
# Which compiler
CC = gcc
# Where to install
INSTDIR = /usr/local/bin
# Where are include files kept
INCLUDE = .
# Options for development
CFLAGS = -g -Wall -ansi
# Options for release
# CFLAGS = -O -Wall -ansi
# Local Libraries
MYLIB = mylib.a
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
-rm main.o 2.o 3.o $(MYLIB)
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
makefile文件和子目录
方法一:子目录中写第二个makefile文件,作用是编译子目录下的源文件并保存到函数库中,然后将函数库拷贝到上一级主目录中,主目录makefile包含一条用于制作函数库的规则,调用第二个makefile文件
mylib.a:
(cd mylibdirectory;$(MAKE))
小括号将这两个命令括起来,使只被一个单独的shell处理。
方法二:makefile中添加一些宏,D代表目录, F代表文件名
.c.o:
$(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F)
更新目录下的函数库:
mylib.a: mydir/2.o mydir/3.o
ar -rv mylib.a $?
make命令 -jN,允许make命令同时执行N条命令
列出依赖关系清单:gcc -MM main.c 2.c 3.c
makefile不仅用于编译源代码或创建函数库。只要是可以通过一系列命令从某些类型的输入文件得到输出文件的任务都可以用makefile文件自动完成。
diff file1.c file2.c > diffs
patch命令升级到file1.c 到file2.c
patch file1.c diffs
恢复:
patch -R file1.c diffs
tar命令:
c: 创建新存档
f:指定目标为一个文件而不是一个设备
t:列出存档的内容,但并不真正释放它们
v:显示tar命令执行的详细过程
x:从存档中释放文件
z:在GNU版本的tar命令中用gzip压缩命令过滤文档