一个简单的makefile文件分析

前一段时间在一个altera开发板上面写了一个以太网卡驱动程序,想写一个上层的程序来测试一下,但是我以前没有学过网络编程呀,只是自学过一点网络编程。刚好也有意愿自己学一下网络编程,于是乎我就屁颠屁颠的下了一本《Unix网络编程卷1:套接字联网API》也把其中的代码下下来了,对于我来说以前编写的应用程序只是gcc -o test test.c一条命令搞定的隐约记得某位大神跟我说过学会这一条命令基本上就能搞定所有的应用程序了(应该也差不多吧),但是发现下载的代码中根本就没有这条语句,只让我们用一句make命令就搞定了,瞬间就颠覆了我的Linux观(其实这条语句还是有的,只是写在了makefile中而已),于是乎我只能看看原来的makefile文件了,其实我以前看过一点makefile文件的,只不过那时候还没理解这个文件究竟是用来干什么的。看完之后就默默的把它给忘了,现在重新捡起来学一下,感觉收获颇多。于是就在学习完makefile之后即兴就来讲一下

我们就以intro文件夹下面的makefile为例吧:

include ../Make.defines
PROGS = daytimetcpcli daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \
daytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \
daytimetcpcliv6 daytimetcpsrvv6 \
byteorder
all: ${PROGS}
daytimetcpcli: daytimetcpcli.o
${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}
daytimetcpcli1: daytimetcpcli1.o
${CC} ${CFLAGS} -o $@ daytimetcpcli1.o ${LIBS}
daytimetcpcli2: daytimetcpcli2.o
${CC} ${CFLAGS} -o $@ daytimetcpcli2.o ${LIBS}
daytimetcpcli3: daytimetcpcli3.o
${CC} ${CFLAGS} -o $@ daytimetcpcli3.o ${LIBS}
daytimetcpsrv: daytimetcpsrv.o
${CC} ${CFLAGS} -o $@ daytimetcpsrv.o ${LIBS}
daytimetcpsrv1: daytimetcpsrv1.o
${CC} ${CFLAGS} -o $@ daytimetcpsrv1.o ${LIBS}
daytimetcpsrv2: daytimetcpsrv2.o
${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}
daytimetcpsrv3: daytimetcpsrv3.o
${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS}
daytimetcpcliv6: daytimetcpcliv6.o
${CC} ${CFLAGS} -o $@ daytimetcpcliv6.o ${LIBS}
daytimetcpsrvv6: daytimetcpsrvv6.o
${CC} ${CFLAGS} -o $@ daytimetcpsrvv6.o ${LIBS}
byteorder: byteorder.o
${CC} ${CFLAGS} -o $@ byteorder.o ${LIBS}
clean:
rm -f ${PROGS} ${CLEANFILES}

首先是一个incldue,这个很熟悉呀,有点类似于我们的文件包含呀,其实和那个差不多,“include“指示符来告诉make暂停获取当前的额makefile,转而去阅读”include“指定的一个或者多个文件,完成之后再去读当前的makefile读取,注意这里的是没有#的哟。在这里很明显是包含一个上一层目录中的Make.defines

文件,这个是用来作甚的呢?大致看了一下就是来进行一些宏定义的,大致就相当于我们C语言中的头文件吧,里面定义了一些我们这个makefile中要用到的宏,下面的

PROGS = daytimetcpcli daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \
daytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \
daytimetcpcliv6 daytimetcpsrvv6 \
byteorder

是一系列的宏定义,用来放在我们的all后面,来表示来编译很多个代码。如果我们只需要编译其中一个的话就在make 命令后面加上相应的名字例如:make daytimetcpcli

make工具会使用gcc 

下面来分析其中某一条命令,其他的都是一样的,

daytimetcpcli:daytimetcpcli.o

${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}

$@ 目录的完整名

根据Make.defines中的定义:

CC = gcc  

CFLAGS = -I../lib -g -O2 -D_REENTRANT -Wall

LIBS = ../libunp.a -lpthread

则原来这条命令可以变为:

gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli daytimetcpcli.o ../libunp.a -lpthread

一个一个来分析:

-I:这个是针对于我们的代码中的#include<file>来说的,通常情况下,gcc/g++会在当前目录下查找头文件,如果没有找到的话,他回到缺省的头文件目录中去寻找,如果使用了-I指定了目录,这两个编译器会先回到指定的目录中去寻找如果没有找到,他会再到系统缺省的目录中寻找

-g 只是在编译的时候产生调试信息

-O2:表示优化

-D_REENTRANT:-D我们说过,这个是一个宏定义。

-Wall 显示警告信息

daytimetcpclidaytimetcpcli.o 这两个就不多说了

LIBS = ../libunp.a -lpthread表示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
makefile 实例分析 Makefile 语法分析 第一部分 VERSION = 2# 给变量VERSION赋值 PATCHLEVEL = 6# 给变量PATCHLEVEL赋值 SUBLEVEL = 22# 给变量SUBLEVEL赋值 EXTRAVERSION = .6# 给变量EXTRAVERSION赋值 NAME = Holy Dancing Manatees, Batman!# 给变量NAME赋值 # *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file. # Do not:# o use make's built-in rules and variables#    (this increases performance and avoid hard-to-debug behavour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory# 操作符“+=”的作用是给变量(“+=”前面的MAKEFLAGS)追加值。# 如果变量(“+=”前面的MAKEFLAGS)之前没有定义过,那么,“+=”会自动变成“=”;# 如果前面有变量(“+=”前面的MAKEFLAGS)定义,那么“+=”会继承于前次操作的赋值符;# 如果前一次的是“:=”,那么“+=”会以“:=”作为其赋值符# 在执行make时的命令行选项参数被通过变量 “MAKEFLAGS”传递给子目录下的make程序。# 对于这个变量除非使用指示符“unexport”对它们进行声明,它们在整个make的执行过程中始终被自动的传递给所有的子make。# 还有个特殊变量SHELL与MAKEFLAGS一样,默认情况(没有用“unexport”声明)下在整个make的执行过程中被自动的传递给所有的子make。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值