免费注册 查看新帖 |

Chinaunix

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

Makefile疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 13:11 |只看该作者 |倒序浏览
下面是MPlayer项目的common.mak部分代码

SRCS_COMMON           += $(SRCS_COMMON-yes)
SRCS_MPLAYER           += $(SRCS_MPLAYER-yes)
SRCS_MENCODER         += $(SRCS_MENCODER-yes)
以上-yes是什么意思?

dep depend::
        $(CC) -MM $(CFLAGS) $(SRCS_COMMON) $(SRCS_MPLAYER) $(SRCS_MENCODER) 1>.depend
这条命令里后面的 1>.depend是什么意思?
我的理解是编译后生成依赖关系文件.depend,编译完了还要依赖关系文件做什么?迷惑。。。





以下是完整代码,部分中文是我加入的注释:

SRCS_COMMON          += $(SRCS_COMMON-yes)
SRCS_MPLAYER         += $(SRCS_MPLAYER-yes)
SRCS_MENCODER        += $(SRCS_MENCODER-yes)

# $(basename $(SRCS_COMMON)) 函数:取SRCS_COMMON文件列表中各文件名的前缀
# $(addsuffiix .o, $(basename $(SRCS_COMMON))) 函数: 给文件名加.o后缀
OBJS_COMMON    += $(addsuffix .o, $(basename $(SRCS_COMMON)) )
OBJS_MPLAYER   += $(addsuffix .o, $(basename $(SRCS_MPLAYER)) )
OBJS_MENCODER  += $(addsuffix .o, $(basename $(SRCS_MENCODER)) )

CFLAGS-$(LIBAVCODEC)     += -I../libavcodec
CFLAGS-$(LIBAVFORMAT)    += -I../libavformat
CFLAGS += $(CFLAGS-yes) $(OPTFLAGS)

LIBS-$(MPLAYER)  += $(LIBNAME_MPLAYER)
LIBS-$(MENCODER) += $(LIBNAME_MENCODER)
LIBS              = $(LIBNAME_COMMON) $(LIBS-yes)

# .a为终极目标
libs: $(LIBS)

# .a: %.o
$(LIBNAME_COMMON):   $(OBJS_COMMON)
$(LIBNAME_MPLAYER):  $(OBJS_MPLAYER)
$(LIBNAME_MENCODER): $(OBJS_MENCODER)
$(LIBNAME_COMMON) $(LIBNAME_MPLAYER) $(LIBNAME_MENCODER):
        $(AR) r $@ $^
        $(RANLIB) $@

clean::
        rm -f *.o *.a *~

distclean:: clean
        rm -f .depend test test2

# gcc参数:
# -M 找出.c文件中的所有依赖文件,包括标准库头文件
# -MM 找出的头文件不包含标准库头文件
dep depend::
        $(CC) -MM $(CFLAGS) $(SRCS_COMMON) $(SRCS_MPLAYER) $(SRCS_MENCODER) 1>.depend

# -include -用来忽略此操作的错误,继续执行
# .depend文件是自动产生的信赖关系文件
-include .depend

.PHONY: libs clean distclean dep depend

论坛徽章:
0
2 [报告]
发表于 2009-02-27 13:22 |只看该作者
大概是表示将 输出重定向到.depend吧

论坛徽章:
0
3 [报告]
发表于 2009-02-27 23:35 |只看该作者

对Makefile知道的也不多,刚才又查了一下,我是这么理解的:

生成的.depend中包含.o的依赖关系,再用include把这些依赖关系包含进来,这样就形成了最一般的makefile格式:
foo.o: foo.c foo.h

foo:foo.o
        rules
...
也就是说“
dep depend::
        $(CC) -MM $(CFLAGS) $(SRCS_COMMON) $(SRCS_MPLAYER) $(SRCS_MENCODER) 1>.depend
”,这两句避免了在Makefile中写依赖关系这个事情。
为什么一定要生成依赖关系呢?因为Make只能自动推导出"foo.o:foo.c"这种依赖关系。依赖关系可能不全,造成编译失败。
具体可以参考"跟我一起写Makefile",里面说的很清楚。这篇文章网上很容易找到,我就不贴链接了。

论坛徽章:
0
4 [报告]
发表于 2009-03-01 10:09 |只看该作者
dep depend::
        $(CC) -MM $(CFLAGS) $(SRCS_COMMON) $(SRCS_MPLAYER) $(SRCS_MENCODER) 1>.depend

论坛徽章:
0
5 [报告]
发表于 2009-03-01 20:15 |只看该作者
1 表示标准输出,$(CC) -MM $(CFLAGS) $(SRCS_COMMON) $(SRCS_MPLAYER) $(SRCS_MENCODER)默认将结果输出到标准输出,即终端,加上1>.depend之后则把该语句执行结果重定向到.depend文件了。
顺便说一下,0 表示标准输入(一般是键盘) 2 表示标准错误。

论坛徽章:
0
6 [报告]
发表于 2009-03-02 12:32 |只看该作者
明白了,谢谢指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP