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 中的内置变量:

[email protected] 当前目标的名称

$^ 所有依赖

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

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

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

CC := gcc 
Objects := test.o
Sources := test.c
test:$(Objects)
    $(CC) -o [email protected] $^
$(Objects):$(Sources)
    $(CC) -c -o [email protected] $^
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 [email protected] $^        或    gcc $^ -o [email protected]
%.o:%.c
    gcc -c -o [email protected] $^    或     gcc -c $^ -o [email protected]
clean:
    rm -f *.o

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

例如:再次简化上例:

test:a.o b.o
    gcc -o [email protected] $^    或    gcc $^ -o [email protected]
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。会将换行符用 $ 显示

时间: 2024-10-06 06:32:42

Linux下make与makefile的相关文章

Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC编译运行一个HelloWorld程序(只涉及单个文件) 可以在任何一个目录编写C程序然后编译运行,我这个实例在自己主目录进行: 然后就进入了编写程序的界面: 按下键盘”i”进入编辑界面,然后输入程序: 按ESC(进入命令行模式),然后输入”:wq”,冒号表示开始输入命令,字母w代表保存文件,字母q代

浅谈Linux下Makefile编写

浅谈Linux下Makefile的编写 前言:本文简要介绍Makefile文件的编写规范,结合具体项目中的应用进行讲解. 具体代码地址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile 简介 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作.而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关

Linux下Makefile的automake生成全攻略

作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将给大家介绍如何使用 autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make instal”就可以把程序安装到Linux

Linux下C/C++程序开发管理(makefile)

一.引言          从我们刚开始编写一个简单的C/C++ "Hello,World!",到将其编译.运行处结果—这部分工作IDE(集成开发环境)帮我们做了,包括语法错误检查,编译,调试,执行二进制程序.大部分时间我们只关注程序代码本身的编写,如何在Linux下对C/C++源代码的      进行有效管理,包括编译.链接.调试,make工具可以帮助我们完成这部分的工作. 二.从“Hello,World”说起 1.执行单个源文件  一个编写好的C或C++代码源程序需要通过编译.链接

linux 下C语言编程库文件处理与Makefile编写

做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目.今天学了2点,一个是库文件处理,另一个是makefile编写. 学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西. gcc的编译过程 首先需要清楚gcc编译做了些什么 源文件

Linux下MakeFile初探

make是linux下的编译命令,用于编译和生成Linux下的可执行文件.这个命令处理的对象是Makefile,makefile等.由于make的强大解析能力,makefile文件的编写也变得极为简单. 以下是一个makefile的例子 1 objects = main.o kbd.o command.o display.o 2 insert.o search.o files.o utils.o 3 4 edit : $(objects) 5 gcc -o edit $(objects) 6 7

Linux下的第一步——进度条(gcc&Makefile)

相信大家在初步学习C/C++的时候都写过"hello world"的代码.在学习了C/C++之后进入Linux系统的学习我们不用再从"hello world"这种入门级程序开始了,毕竟已经有了几年的小经验,但是重新开始在一个新的系统下编写代码,特别是对于Linux中庞杂的指令是需要一个熟悉与练习的过程的.进度条的小程序对于我们熟悉指令,练习VIM下代码的编辑以及gcc和Makefile等工具的使用都是很有帮助的. VIM之前已经介绍过了,就不做过多赘述,今天利用这个

Linux下的makefile的妙用dd

一:起因 (0)首先我们假设读者已经熟悉了Linux 下的vim的常用操作(如,u 撤消 或  :undo   CTRL-R 重做 或  :redo): (1)Linux下面的make命令,应用与makefile文件,当我们需要对一个C / C++ 或者Java等一个工程里面的所有源文件进行编译时,每一次编译,都不想重复操作以前的命令,更不想把未更改过的源文件再次进行不必要的编译操作 -- 最佳选择makefile(PS:虽然这时,你可以选择写一个shell,但是shell需要太多的代码了,好多

Linux下makefile教程

转自陈皓 (CSDN)概述--什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile