一个简单的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来说的,通常情况下,gcc/g++会在当前目录下查找头文件,如果没有找到的话,他回到缺省的头文件目录中去寻找,如果使用了-I指定了目录,这两个编译器会先回到指定的目录中去寻找如果没有找到,他会再到系统缺省的目录中寻找

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

-O2:表示优化

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

-Wall 显示警告信息

daytimetcpclidaytimetcpcli.o 这两个就不多说了

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

你可能感兴趣的:(Linux驱动相关,我自己的学习日志)