Makefile的结构和使用

来源:互联网 发布:软件开发学校好吗 编辑:程序博客网 时间:2024/06/10 16:23

背景:

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令Linux环境下的程序员如果不会使用GNUmake来构建和管理自己的工程,应该不能算是一个合格的专业程序员。在Linux(unix环境下使用GNU的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行不过这需要我们投入一些时间去完成一个或者多个称之为Makefile文件的编写所要完成的Makefile文件描述了整个工程的编译、连接等规则其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个正确的Makefile编译整个工程你所要做的唯一的一件事就是在shell提示符下输入make命令整个工程完全自动编译,极大提高了效率

结构:

#  #表示注释

#变量定义

VAR=test  定义变量VAR,强制赋值为app 

VAR+=app  VAR之前定义的值后面再追加app这个值

VAR?=testapp  如果之前VAR没有被定义,则定义并使用testapp;否则使用之前的值

#第一条目标为总的目标,

#依赖可以是文件(目录)或为其他目标

#动作可以是Linux命令,动作的那一行第一个字符必须是以TAB

target:   depend1  depend2 depend3 ...

[TAB]  action1 

[TAB ] action2

target1:

[TAB] action1

[TAB] action2

使用:

make  makefileMakefile文件执行总的目标

make clean 执行makefile文件中的clean目标

make -C directory 进入到directory文件夹中去执行总的目标

make clean -C direcotry 进入到directory文件夹中去执行clean目标

make -f comm_makefile  通过-f选项指定一个makefile文件

make VAR=value  Makefile传一个参数VAR,其值为value

实例:

APPNAME=link

LIB_SRCS=linker.c

LIB_NAME=linker

LIB_PATH=.libs

CFLAGS+=-I${LIB_PATH}

LDFLAGS+=-L${LIB_PATH} -l${LIB_NAME}

all: clean static_lib shared_lib install

        gcc ${CFLAGS} main.c -o${APPNAME}_static ${LDFLAGS} -static

        gcc ${CFLAGS} main.c -o${APPNAME}_shared ${LDFLAGS}

        @rm -f *.o

static_lib: linker.c

        gcc -c ${LIB_SRCS}

        ar -rcs lib${LIB_NAME}.a *.o

        rm -f *.o

shared_lib:

        @gcc -fPIC -shared${LIB_SRCS}  -o lib${LIB_NAME}.so

clean:

        @rm -f *.o

distclean:

        rm -rf .libs

        rm -rf ${APPNAME}_*

install:

        mkdir -p ${LIB_PATH}

        mv lib${LIB_NAME}.*${LIB_PATH}

        cp linker.h ${LIB_PATH}


[zusi@centos6 linker]$ ls

linker.c linker.h  main.c  makefile

[zusi@centos6 linker]$ make

[zusi@centos6 linker]$ make install

[zusi@centos6 linker]$ make clean

[zusi@centos6 linker]$ makedistclean


原创粉丝点击