码迷,mamicode.com
首页 > 系统相关 > 详细

Linux下make与makefile

时间:2016-01-15 17:50:31      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:linux   make   makefile   

make 用来解析 makefile 文件


make 的选项:

-d 显示调试信息

-f 文件 默认是从 makefile 或 Makefile 中读取依赖信息,用该选项可更改文件

-h 显示所有 makefile 的 help 信息

-n 显示 makefile 执行命令的顺序,但不执行

-s 运行时不显示任何信息




makefile 格式:


目标:依赖列表

<Tab>命令列表


目标通常是指要生成的文件的名称,可以使可执行文件或obj文件,也可以是一个执行的动作名称,如clean

。依赖是用来  产生目标  的材料,比如源文件,一个目标经常有多个依赖

命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行


执行make clean时,由于clean没有依赖,所以它的命令将被强制执行

make clean中的 clean 是一个虚目标,一般用来删除 make 产生的文件


makefile 语法:


# 注释

\ 连接符,前后不要有空格

?,* 通配符



例1. hello.c文件内容:

#include<stdio.h>
int main(void)
{
printf("Hello Linux!\n");
return 0;
}

关于hello.c的 makefile 文件内容为:

hello:hello.o
gcc -o hello hello.o或 gcc hello.o -o hello
hello.o:hello.c
gcc -c -o hello.o hello.c或 gcc -c hello.c -o hello.o
clean:
rm -f *.o


多文件时 makefile 编写:


例2.假如源文件 a.c 和 b.c 可生成可执行文件 test。其 makefile 文件内容为:

test:a.o b.o
    gcc -o test a.o b.o    或  gcc a.o b.o -o test
a.o:a.c
    gcc -c -o a.o a.c     或   gcc -c a.c -o a.o
b.o:b.c
    gcc -c -o b.o b.c     或   gcc -c b.c -o b.o
clean:
    rm -f *.o



make 只有在依赖比目标新的时候才会执行其后命令。可通过 touch 命令修改某文件时间。




makefile 中变量的 定义 方式为: 变量 := 值

makefile 给变量 增加 一个值为: 变量 += 值

makefile 中变量的 引用 方式为: $(变量名) 或 ${变量名}、$单字符变量


例如:

C=gcc

$C


CC=gcc

$(CC) 或 ${CC}



例3:

用此方式,修改 例1 的 makefile 文件为:

CC := gcc 
Objects := test.o
Sources := test.c
test:$(Objects)
    $(CC) -o test $(Objects)
$(Objects):$(Sources)
    $(CC) -c -o $(Objects) $(Sources)
clean:
    rm -f *.o


makefile 中还可添加如下命令来进行打包:


tar:

tar -cvf pack.tar makefile *.c *.h 


执行 make tar 就可以将文件夹中所有 .c .h 还有 makefile 文件打包


makefile 中的内置变量:


$@ 当前目标的名称

$^ 所有依赖

$< 比当前目标更新的依赖。第一个依赖

$? 比当前目标更新的依赖 列表 。表示所有已修改的依赖文件


利用内置变量,修改 例3 的 makefile 文件为:

CC := gcc 
Objects := test.o
Sources := test.c
test:$(Objects)
    $(CC) -o $@ $^
$(Objects):$(Sources)
    $(CC) -c -o $@ $^
clean:
    rm -f *.o


注意:内置变量指代的内容是不固定的,是随上下文变化的。例如:

abc:bcd

里面的目标为 abc ,依赖为 bcd。而

hello:hello.c

里面的目标为 hello,依赖为 hello.c 



还可以利用 makefile 默认的识别方式,用 %.c 表示所有 .c 文件,%.o 表示所有 .o 文件:

例如:改写 例2:

test:a.o b.o
    gcc -o $@ $^        或    gcc $^ -o $@
%.o:%.c
    gcc -c -o $@ $^    或     gcc -c $^ -o $@
clean:
    rm -f *.o


makefile 如果省略文件名,会默认将目标与依赖同名。此时,可省略依赖和命令。

例如:再次简化上例:

test:a.o b.o
    gcc -o $@ $^    或    gcc $^ -o $@
a.o:
b.o:
clean:
    rm -f *.o


上面的

a.o:

b.o:

两行可以简写成一行:

%.o:



虚目标:


makefile 中有一些目标,它们是一些不存在的文件,而且也无需创建他们,这些目标称虚目标。

虚目标允许你强制执行某些事件,而这些事件在正常规则中不会发生。

虚目标总是使与之有关的命令被执行。


常见虚目标列表:

all 生成工程中所有可执行者,通常是 makefile 的第一个生成目标

clean 删除 make all 生成的所有文件

install 在系统目录中安装工程项目生成的可执行文件和文档

uninstall 删除 make install 安装的所有文件



例如,某安装包的 makefile 文件如下:

InstallDir := /usr/local/bin/
install:a b
    cp -f $^ $(InstallDir)
    cd $(InstallDir); chmod 777 $^
    rm -f *.o $^
uninstall:
    cd $(InstallDir); rm a b
a:a.o
    gcc -o a a.o
a.o:a.c
    gcc -c -o a.o a.c
clean:
    rm -f *.o


执行 make install 即可安装。


有时候,为了防止 makefile 中的虚目标与实际文件重名,例如:实际路径中存在一个 install 文件,如果执行 make install ,则会报错。为了防止这种情况,可在虚目标前面加上修饰符,如下:


.PHONY:clean


加上之后,即使有同名文件,也不会报错。


下例执行 make all 可以生成所有目标:

all:test hello

test:test.o

.....

hello:hello.o

....


makefile 常见错误:

1.制表符用空格代替。解决办法:cat -t makefile可查看makefile中的制表符:^I

2.连接符‘\‘和换行符之间插入了空格。解决办法:cat -e makefile。会将换行符用 $ 显示

本文出自 “_柯南Conan_” 博客,请务必保留此出处http://goodhx.blog.51cto.com/9727085/1735390

Linux下make与makefile

标签:linux   make   makefile   

原文地址:http://goodhx.blog.51cto.com/9727085/1735390

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!