Makefile编译文件

来源:互联网 发布:漫画本子在淘宝怎么搜 编辑:程序博客网 时间:2024/06/10 02:36

    make工程管理器根据时间戳来确定需要编译的文件,通过读入Makefile文件的内容来执行大量的编译工作。
管理较多的文件

Makefile结构:
hello.o :hello.c
    gcc -c hello.c -o hello.o
(目标文件:依赖文件,命令前加上TAB,且在目标文件之后)

makefile命名方式:
Makefile、makefile、GNUmakefile       名字.mk  名字.Linux  名字.AIX
执行方式:
前三种命名方式:make   make将只编译改动的代码文件,而不用完全编译
后三种命令方式:make -f 文件名

Makefile主要包含5部分:显示规则、隐式规则、变量、条件语句、函数(这5类中都可能结合正则表达式使用)

使用makefile过程中需要关心两种文件:.c文件 .o文件
预处理:gcc -E 1.c -o 1.i
编译:gcc -S 1.i -o 1.s
汇编:gcc -c 1.s -o 1.o     前三个过程合到一起:gcc -c 1.c -o 1.o
链接:gcc 1.o -o 可执行文件名

显示规则语法:
目标文件:目标的依赖文件
    生成目标文件的命令

自定义头文件:函数声明、系统头文件、宏定义、类型定义

在makefile中如果需要执行命令,必须以tab开头并且必须要在目标或者伪目标下出现.
伪目标文件如果出现在Makefile文件中部或者尾部默认不执行,如果放在Makefile文件的开头则无条件执行伪目标。

makefile变量定义:
变量 = 内容
几种使用方式:
var=a(递归展开)  / var+=a(添加新值)   /var:=a(简单方式)  /  var?=a(如果没有被定义过,那么var就是a,
如果被定义过就什么也不做)  
---------------------
引用: ${变量名}  $(变量名)
OBJ = main.o score.o
CC=gcc

abc:${OBJ}
    $(CC) $(OBJ) -o abc 变量名用()或者{}括起来

main.o:head.h
score.o:head.h

.PHONY:clean
#clean叫做伪目标文件
clean:
    rm *.o abc
-------------
OBJ=main.o score.o
CC = gcc
FLAGS = -c -o
stu:$(OBJ)
    $(CC) $(OBJ) -o stu

#  $^代表的是所有依赖文件
#  $<代表的是第一个依赖文件
#  $@代表目标文件
# $?代表时间戳比目标文件晚的依赖文件,并以空格分开
main.o:main.c 1.c
    $(CC) $< $(FLAGS) $@
    echo $<

score.o:score.c
    $(CC) $^ $(FLAGS) $@

clean:
    rm *.o stu
---------------------------------

查看makefile文件中的内置变量:  make -p Makefile > 任意一个文件名

条件语句:
ifeq (字符串1,字符串2)   如果两个字符串相等则条件成立
ifeq(arg1,arg2)或者ifeq "arg1","arg2"
else ...
endif
ifdef 变量  判断变量是否初始化,这里的变量不能使用$

函数:使用规则为 $(函数名 参数1,参数2,参数3,....,参数n)

makefile显示规则:
abc:main.o  fun.o
    gcc  main.o fun.o -o abc
main.o:main.c
    gcc -c main.c -o main.o
fun.o:fun.c
    gcc -c fun.c -o fun.o

clean:
    rm main.o fun.o abc

makefile隐式规则:(只写头尾)
abc:main.o fun.o
    gcc  main.o fun.o -o abc
main.c:1.h
fun.c:1.h
clean:    
    rm main.o fun.o abc

Makefile总控:同时make多种Makefile文件
$(MAKE) -C read  (-C用来切换路径,切换到read路径下并执行MAKE)
echo $MAKE 结果为make

实际项目中的Makefile:
#export PATH=$PATH:../Compiler/gcc-4.2.171-eglibc-2.5.171/powerpc-linux-gnu/bin
#CC = powerpc-linux-gnu-gcc
#AR = powerpc-linux-gnu-ar

CC = gcc
CFLAGS = -Wall 
OBJS =  test.o 
PGM = test

all: $(PGM)

#$(OBJS):%.o:%.c
# $(CC) $(CFLAGS) $< libLT_CB.a -o $@

$(PGM):$(OBJS) libLT_CB.a
$(CC) -o $(PGM) -lm $^

clean:
rm -f test *.o