博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

举例书写Makefile文件(C语言)

Posted on 2011-04-14 22:17  天地玄黄  阅读(2957)  评论(0编辑  收藏  举报

        在这里,我自己写一个自己的Makefile的例子,说明一下Makefile是怎么写的。

 

     准备工作:为了使我们的代码更加接近真实的大型程序,我们可以从网络上下载一些写好的源代码。我所使用的是 “Unix Network Programming” 这本书中的源代码。代码下载地址为:www.unpbook.com,下载的文件为unpv13e.tar.gz。使用命令 tar –zxvf unpv13e.tar.gz 直接解压就可以。解压之后按照README文件先编译一下(也可以不用做这一步,直接看下面的内容,如果在unpv13之下没有libunp.a这个文件再做这一步)。

     进入目录,我们来建立一个自己的Makefile文件,自己编译自己的程序。

     在unpv13e/ 这个目录内建立自己的一个目录。 拷贝unpv13e/tcpcliserv/ 目录下的 tcpserv01.c 和 str_echo08.c 到自己建立的目录下,给他们命名为tcpserv.c 和 str_echo.c。 并在这个目录下建立自己的Makefile文件。

 

        首先,在目录 ~/unp/unpv13e/test/tcpserv 这个文件夹下写自己的程序,有两个文件,tcpserv.c 和 str_echo.c,还有自己写的Makefile 文件:

test@Ubuntu:~/unp/unpv13e/test/tcpserv$ ls
Makefile  str_echo.c  tcpserv.c

        tcpserv.c 和 str_echo.c这两个文件都是用 unp.h 这个头文件,而这个文件的位置在 ~/unp/unpv13e/lib/ 这个目录中。它们不再调用其他头文件。

        tcpserv.c 的开头为:

#include "unp.h"

 

       str_echo.c 的开头为:

#include "unp.h"

        在unp.h中,它自己又使用其它的头文件:

#include        "../config.h"   /* configuration options for current OS */

#include        <sys/wait.h>
/* soem other headers …… */

# include       "../lib/addrinfo.h"

      我的Makefile 文件是这样写的:

CC = gcc
CFLAGS = -I../../lib -Wall

tcpserv: tcpserv.o str_echo.o
        $(CC) $(CFLAGS) -o $@ $^ ../../libunp.a

.PHONY: clean
clean:
        -rm *.o tcpserv

 

        其中 –I../../lib 标记表示gcc 编译的时候,以Makefile文件所在的目录为基准,在目录 ../../lib 中查找头文件,也就是在~/unp/unpv13e/lib/ 这个文件中查找。../../lib是一个相对路径,你也可以把它换成绝对路径,比如 –I/home/test/unp/unpv13e/lib

        -Wall 选项进行更好的判断。

        $@ 表示target,这里即tcpserv

        $^ 表示所有 依赖关系,这里即tcpserv.o 和 str_echo.o

        ../../libunp.a 是一个库文件(在Unix中叫做Archive File),里面放有很多自己定义的函数,我在tcpserv.c 和 str_echo.c 中都使用到了这些函数。.a 文件是把好多 .o 文件合在一起构成的一个文件,它并不依赖于.c源文件的存在。

        .PHONY: clean 是指定clean为伪目标,即clean是一个假的target,make命令不会生成这个文件。

        rm命令之前有一个小小的减号,表明忽略错误,继续执行。

 

        如果rm之间没有减号,那么一旦出错,就会停止执行。看下面的代码:

clean:
     rm *.o
     rm tcpserv


        在终端中运行 make clean 命令,如果当前目录下只有tcpserv.c str_echo.c Makefile 这三个文件,那么就会出现下面的情况:

rm *.o
rm: 无法删除 “*.o”: 没有那个文件或目录
make: *** [clean] 错误 1

  执行到rm *.o之后就会停下来,不再执行rm tcpserv了。

 

        编好自己的Makefile 之后,可以在终端中运行 make –n 命令查看自己所写的Makefile 文件会执行哪些命令,这可以用来判断我们的Makefile是否正确。

 

        使用make 命令进行编译。