初识makefile

Makefile的规则

  目标 : 需要的条件 (注意冒号两边有空格)

    命令  (注意前面用tab键开头)

  解释一下:

  1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。

  2 需要的条件就是生成目标所需要的文件或目标

  3 命令就是生成目标所需要执行的脚本

  总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。

下面举个简单的例子说明。如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o /
           insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o /
                       insert.o search.o files.o utils.o

main.o : main.c defs.h
            cc -c main.c
kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
command.o : command.c defs.h command.h
            cc -c command.c
display.o : display.c defs.h buffer.h
            cc -c display.c
insert.o : insert.c defs.h buffer.h
            cc -c insert.c
search.o : search.c defs.h buffer.h
            cc -c search.c
files.o : files.c defs.h buffer.h command.h
            cc -c files.c
utils.o : utils.c defs.h
            cc -c utils.c
clean :
            rm edit main.o kbd.o command.o display.o /
               insert.o search.o files.o utils.o

以上内容摘自如何编写makefile

下面来说说自己的总结:

  我写了三个文件:hello.c test.c test.h。内容如下:

hello.c:

#include <stdio.h>
#include "test.h"

void main(void)
{
    char s[] = "Bye~";
    printf("Hello World!\n");
    test(s);
}

test.h:

#ifndef __TEST_H_
#define __TEST_H_

#include <stdio.h>

int test(char *s);

#endif

test.c:

#include "test.h"

int test(char *s)
{
    printf("%s...\n",s);
    return 1;
}

makefile如下:

main : hello.o test.o
    gcc -o main1 hello.o test.o
hello.o : hello.c
    gcc -c hello.c
test.o : test.c test.h
    gcc -c test.c
clean :
    rm hello.o test.o

其中,第一行的main只是一个标签,怎样写都可以。第二行的main1才是最终生成的目标文件,并且目标和依赖的位置可以互换,比如:

gcc hello.o test.o -o main1

如果工程中包含头文件,只需要在第一行的依赖中写出来,第二行不用写:
test.o : test.c test.h
    gcc -c test.c

make完了之后再make clean一下,清除临时文件。
时间: 2024-10-21 19:26:30

初识makefile的相关文章

初识 makefile 的结构(二)

我们在上节中说到 makefile 的本质就是一个脚本程序,用来解释执行的.那么它的意义是用于定义源文件间的依赖关系,说明如何编译各个源文件并生成可执行文件.我们来看看依赖的定义,如下 下来我们来分析下 makefile 中元素的意义:a> targets:通常是需要生成的目标文件名,make 所需执行的命令名称:b> perequisities:当前目标所依赖的其他目标或文件:c> command:完成目标所需要执行的命令.我们来说说规则中的注意事项:a> targets 可以包

Makefile之深入浅出

什么是 make 呢?为什么需要 make 呢?在我们之前学习的 C 语言以及 C++ 语言中,我们在编译的时候只需要 gcc 或者 g++ 命令就可以完成源码的编译了.但是在嵌入式中一些大型的项目中,如内核的编译,动辄上万个源文件,我们还可能去一行一行的敲 gcc 命令吗?肯定不会了,这时我们便需要一个工具来进行代替了,此时便需要 makefile 了. 本系列博客内容是根据狄泰软件学院的<门徒计划>中的 makefile 相关内容总结而来.其中包含了 Makefile 语言的各种基础知识点

第0课 - Makefile引言

Makefile引言 第1课 - make 和 makefile 第2课 - 初识makefile的结构 第3课 - makefile伪目标的引入 第4课 - 变量和不同的赋值方式 第5课 - 预定义变量的使用 第6课 - 变量的高级主题(上) 第7课 - 变量的高级主题(下) 第8课 - 条件判断语句 第9课 - 函数定义及调用 第10课 - 变量与函数的综合示例 第11课 - 自动生成依赖关系(上) 第12课 - 自动生成依赖关系(中) 第13课 - 自动生成依赖关系(下) 第14课 - 自

makefile(01)_初识

0. 声明 本系列(makefile)文章,从零基础开始,通过实验逐步分析makefile的语法特性,并最终打造一个可复用.可移植的专业编译环境.参考:1.DT 唐老师门徒计划课程2.GNU make 手册:http://www.gnu.org/software/make/manual/make.html 1.Make与makefile Make是一个应用程序:接续源程序之间的依赖关系,根据依赖关系自动维护编译工作,执行宿主操作系统中的各种命令. Makefile是一个描述文件:定义了系列的规则

初识Sake和KoreBuild

初识Sake和KoreBuild 最近在了解Asp.net Core 1.0(也可称为Asp.net5\Asp.net vNext)的跨平台,发现了两个新的新东西:Sake和KoreBuild(或者已经出了很久). 通过国内某度查询资料大部分都是复制黏贴来的,几乎没有详细的介绍. 只好看源码,Sake可以到Github查到源码 KoreBuild可以通过Nuget下载安装. 打开安装的KoreBuild文件夹 总所周知 cmd是在windows环境下的执行文件: sh是其他OS下的执行文件: 那

Qt初识

初识Qt 一.维基百科定义: Qt (/kjut/ "cute", or unofficially as Q-T cue-tee) is a cross-platform application framework that iswidely used for developing application software with a graphical user interface (GUI) (inwhich cases Qt is classified as awidget t

使用Cython为Python写扩展1:初识Cython

使用Cython为Python写扩展1:初识Cython Cython使为Python写C扩展就如同写Python代码一样简单.广泛用于数学软件包,SAGE公司,作为执行快速,可扩展的运算.它提供了安全和可维护的方法通过自动生成所需代码来构建原生Python模块. 我们经常会使用Cython将C/C++实现的系统绑定到Python中,这样我们就可以使用Python来处理高级别逻辑,原生模块来处理底层代码. 关于示例 代码 http://git.oschina.net/erhuabushuo/le

初识ASP.NET 5中的Sake与KoreBuild

从github上签出基于ASP.NET 5的MVC 6的源代码进行编译,发现有2个编译命令: build.cmd是针对Windows的编译命令,build.sh是针对Mac/Linux的编译命令,这本来没什么稀奇,但是打开这2个文件一看: build.cmd: packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* build.sh: mono packages/Sake/tools/Sake.e

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的