makefile和Makefile是等效的
$mv makefile Makefile
$make
gcc -c main.c
gcc -c liu.c
gcc -c generatedatafile.c
gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz
rm -f *.o
Makefile文件格式
Makefile文件格式--------以小节(rule)为基本结构
命令行必须用TAB,不能用一串空格
TAB是command行的标志
只make单个小节
make install和make clean也是单小节
小节menu化
小节引用,直接在写在depend处
makefile的注释类似shell,在以"#"为开头的的文字皆为注释
小节(rule)的command里,就是普通的unix命令,可以是gcc命令,也可以是任何unix command
另一个例子:
通常在最后链接的小节加入删除语句,删除掉中间产生的*.o文件
用make的内部宏$(RM)实现删除
makefile文件中的宏变量替换、宏变量引用要带$()
为什么make 引用变量要加$( )?
因为那根本不是变量,而是宏
Makefile中所有文件名都是路径名,可以带目录路径,如src/main.c
main.o: main.c comm.h
gcc -c
main.c $(INC)
源文件在当前目录下
main.o: src/main.c include/comm.h
gcc -c
src/main.c $(INC)
源文件在子目录下
$@ 和$? 的用法:
target: depend
$@
:
$?
$? 可以代替多个(所有的)depend
编译时,不用带.h文件
$vi makefile
main.o: main.c comm.h
gcc -c main.c
所谓“编译带不带.h"文件的实质----depend是做什么用的
depend的含义:如果target检查发现depend中有任何一个自己新,就重新编译。
下面这个depend comm.h还是必要的, 因为comm.h是
自定义头文件,有可能被修改
下面这个mysql.h就毫无必要, 因为这是标准头文件,不可能被修改,也没必要depend
其他如stdio.h之类的标准头文件,也没必要出现在depend中
如果depend中是小节, 那么重定向到小节处,继续
检查depend的时间戳
如果自定义的头文件中还include 自定义头文件(连环套),也要用在depend 中
depend xxx.h文件的缺憾,不能继续用$?了
采用结构化编程的make
$mv makefile Makefile
$make
gcc -c main.c
gcc -c liu.c
gcc -c generatedatafile.c
gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz
rm -f *.o
$cat Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz all: liu clean liu: main.o: main.c liu.o: liu.c generatedatafile.o: generatedatafile.c clean: |
[macg@localhost mysqltmp]$ more makefile liu: main.o: main.c comm.h liu.o: liu.c /usr/include/mysql/mysql.h generatedatafile.o: generatedatafile.c |
只make单个小节
$make main.o gcc -c main.c | main.o: main.c |
#cat Makefile … install: … clean: … |
小节引用,直接在写在depend处
$vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz liu: liu depend 4个小节:main.o liu.o generatedatafile.o clean main.o: main.c liu.o: liu.c generatedatafile.o: generatedatafile.c clean: |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c rm -f *.o gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz gcc: main.o: No such file or directory gcc: liu.o: No such file or directory |
因为总的执行顺序: o o o o o 等于是在gcc link前,先把*.o又删掉了,所以出错 |
正确的做法 $vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient –lz all: liu clean 设一个总的menu小节 o o liu: main.o: main.c liu.o: liu.c generatedatafile.o: generatedatafile.c clean: |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o |
install: liu liu: liu.o |
先执行depend liu小结,生成可执行文件liu 将生成的可执行文件改权限 将生成的可执行文件copy到适当的安装目录 |
clean: 删除掉中间产生的*.o文件 |
$vi makefile LDFLAGS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz liu: |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o $ls comm.h dataf |
vi Makefile liu: |
$make gcc -c main.c gcc -c liu.c gcc -c generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o |
$vi makefile LDFLAGS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz liu: $make gcc -c liu.c gcc -g main.o liu.o generatedatafile.o -o liu DFLAGS gcc: DFLAGS: No such file or directory *** Error code 1 |
$vi makefile liu: $make gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz |
因为那根本不是变量,而是宏
main.o: main.c comm.h
main.o: src/main.c include/comm.h
target: depend
$@
liu: |
$vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz all: liu clean liu: main.o: main.c liu.o: liu.c generatedatafile.o: generatedatafile.c clean: |
$vi makefile
main.o: main.c comm.h
depend的含义:如果target检查发现depend中有任何一个自己新,就重新编译。
<Target 1>: depend |
main.o: main.c comm.h |
其他如stdio.h之类的标准头文件,也没必要出现在depend中
liu.o: liu.c /usr/ /include/mysql/mysql.h |
liu: main.o main.o:main.c |
main.o: main.c comm.h |
$make gcc -c src/main.c include/comm.h –Iinclude |
正确的做法:直接用文件名,不用$? main.o: src/main.c include/comm.h |
- 目录树
- 在顶层目录建立Makefile
vi Makefile LIBS=-L/usr/local/mysql/lib/mysql -L/export/home/macg/mysqltmp/lib -lmysqlclient -lz -lcomm INC=-Iinclude all: liu clean liu: main.o: src/main.c 自定义头文件不能重复include 建议在main.c中include(假设有多个文件使用) 或者在使用文件include(假设只有一个文件使用) liu.o: src/liu.c generatedatafile.o: src/generatedatafile.c clean: |
make
$make gcc -c src/liu.c gcc -c src/generatedatafile.c gcc -g main.o liu.o generatedatafile.o -o liu -L/usr/local/mysql/lib/mysql -lmysqlclient -lz rm -f *.o |
[macg@machome]:/export/home/macg/mysqltmp>$ls -F |