免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1159 | 回复: 0
打印 上一主题 下一主题

Makefile编写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-20 16:29 |只看该作者 |倒序浏览
Makefile编写
编译:将源码编译成.o文件
链接:将多个.o文件合并成可执行文件
例,工程中有8个C文件,3个头文件
编译规则:
如果这个工程没有编译过,那么所有的C文件都要编译并链接
如果某几个C文件被修改,则只编译被修改的文件,并链接目标程序
如果头文件被更改了,则编译引用了该头文件的C文件,并链接目标程序
vi makefile
edit:main.o kbd.o command.o display.o \
     insert.o search.o files.o utils.o
    cc -o edit main.o kbd.o command.o display.o \
          insert.o search.o files.o utils.o
main.o:main.c defs.h
    cc -c main.c
kdb.o:kdb.c defs.h command.h
    cc -c kdb.c
command.o:command.c defs.h command.h
    cc -c command.c
display.o:display.c defs.h buffer.h
    cc -c display.c
insert.o:insert.c defs.h buffer.h
    cc -c insert.c
search.o:search.c defs.h buffer.h
    cc -c search.c
files.o:files.c defs.h buffer.h command.h
    cc -c files.c
utils:utils.c defs.h
    cc -c utils.c
clean:
    rm edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o
目标:依赖关系
    编译命令
使用变量
objects=main.o kdb.o command.o display.o  insert.o search.o files.o utils.o
引用变量
$(objects)
例:
rm edit $(objects)
自动推导
GNUmake可以自动推导文件以及文件依赖关系后面的命令
如果make找到一个.o文件,它会自动把.c文件加入到依赖文件中,并用cc -c *.c 也会被推导出来
这样可以简化makefile的写法
vi makefile
objects=main.o kdb.o command.o display.o  insert.o search.o files.o utils.o
edit:$(objects)
    cc -o edit $(objects)
main.o:defs.h
kdb.o:defs.h command.h
comamnd.o:defs.h command.h
display.o:defs.h buffer.h
insert.o:defs.h buffer.h
search.o:defs.h buffer.h
files.o:defs.h buffer.h command.h
utils.o:defs.h
.PHONY:clean
clean:
rm edit $(objects)
另类更简易的写法
vi makefile
objects=main.o kdb.o command.o display.o  insert.o search.o files.o utils.o
edit:$(objects)
    cc -o edit $(objects)
$(objects):defs.h
kbd.o command.o files.o:command.h
display.o insert.o search.o files.o:buffer.h
.PHONY:clean
clean:
rm edit $(objects)
清除目标文件规则
.PHONY:clean
clean:
-rm edit $(objects)
减号表示如果某些文件出现问题也不管继续执行后续命令
指定非正规的makefile文件名
make -file make.linux //短选项
make --file make.linux //长选项
包含其它makefile文件
include filename
例:
bar=a.mk b.mk c.mk
include foo.make *.mk $(bar)
显示命令
@ 正在编译X模块...
命令执行
当上一行命令的执行要应用在下一行时必须写在同一行上用分号分隔
exec:
    cd /home/guest;pwd
忽略错误继续执行
1.在命令行前加-(减号)
2.给make加参数-i(--ignore-errors)
嵌套执行makfile
各分目录有自己的makefile,总控目录有一个makefile管理着所有的makefile文件
subsystem:
    cd subdir && $(MAKE)
$(MAKE)宏变量的意义在于我们可以指定make的一些参数
传递变量到下级makefile中
export 变量
不想传递变量到下级makefile中
unexport 变量
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/56374/showart_446530.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP