//swap.c
#include<stdio.h>
int swap(int *x,int *y)
{printf("a=%d b=%d\n",*x,*y);
int z;
z=*x;
*x=*y;
*y=z;
printf("a=%d b=%d\n",*x,*y);
}
//max.c
int max(int a,int b)
{
return a>b?a:b;
}
//test.c
int main()
{
int x=,y=;
printf("max=%d\n",max(x,y));
swap(&x,&y);
}

下来我们来编写Makefile文件
vi Makefile //文件名一定要为Makefile,不能是其他任何名字,标准为Makefile,书上写的是makefile
all:test//all也可以改为其他任何名字
max.o:max.c
gcc -o max.o -c max.c//最前面是个TAB键,固定格式不能修改的!!!
swap.o:swap.c
gcc -o swap.o -c swap.c
test.o:test.c
gcc -o test.o -c test.c
test:max.o swap.o test.o
gcc -o test swap.o max.o test.o

编写Makefile时,最好用vi编辑器,不可用记事本gedit,否则会出现如下错误的!!!!

接着昨天的写



touch可以修改文件的时间!可以看出现在swap.c的时间大于swap.o的时间!

make的原理
1:makefile怎么知道了哪个文件被修改了
根据时间判断哪个文件被修改了
make如何知道那个.c文件被修改了,然后只重新单独编译此文件,其他没有修改的文件不会被再次编译, 如果只修改了某个.o文件,只做链接,这节省了好多时间的啊!!一句话只要做了修改,最后的的链接是必不可少的!!!
2:makefile文件是如何执行的呢?
exe:test
max.o:max.c
gcc -o max.o -c max.c
swap.o:swap.c
gcc -o swap.o -c swap.c
test.o:test.c
gcc -o test.o -c test.c
test:max.o swap.o test.o
gcc -o test swap.o max.o test.o
[root@linux Makefile_example]#
如果没有.o文件的话,那么就全部执行上面的所有操作!
如果已经make后,再次修改某个.o或者.c文件然后用他们的时间进行比较,如果.o文件的时间小于.c文件的时间,说明.c文件被修改过,那么就执行gcc -o xxx.o -c xxx.c这句
接着执行gcc -o test swap.o max.o test.o这句!
还有一个问题那就是为神魔要开头的这一句呢!exe:test
因为如图:

test相当于main函数max.o swap.o test.o相当于调用函数!函数调用完毕后返回调用函数处,接着调用下一个函数;好像也可以不用最上面的exe:test,但是要把下面的语句放在最上面才可以!!!
test:max.o swap.o test.o
   gcc -o test swap.o max.o test.o

今天老师又讲了另一种方法来编写Makefiel

我们来看下

//文件名为Makefile

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)//这句两句一定要放在这儿,不能放在后面那三
$(CC) -o $(EXEC) $(OBJS)
max.o:max.c
$(CC) -o max.o -c max.c
swap.o:swap.c
$(CC) -o swap.o -c swap.c
test.o:test.c
$(CC) -o test.o -c test.c

重新写Makefile文件

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
max.o:max.c
$(CC) -o $@ -c $<
swap.o:swap.c
$(CC) -o $@ -c $^
test.o:test.c
$(CC) -o $@ -c $^

执行情况同上,就不截图了啊!!!

重新写Makefile

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
%.o:%.c
$(CC) -o $@ -c $<
cleal:
rm *.o $(EXEC)

执行情况如下:

重新写Makefile

EXEC=/usr/bin/www  把可执行文件放在

任意一个系统默认的路径里,就可以只用文件名来执行,而不用像以前那样输入./test;

为什么我这儿要将EXEC=/usr/bin/test换为www因为如果不换不能在任意目录通过文件名来执行,但是可以通过绝对路径来执行(/usr/bin/test),我估计以前我创建

了test在上述路径的目录里,所以可能执行了以前的,没有执行这次的二进制文件!!!

如何编写Makefile?的更多相关文章

  1. 如何自己编写Makefile

    如何自己编写Makefile   相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用 ...

  2. 教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...

  3. 如何编写makefile

    一:Makefile介绍: Makefile是为自动化编译而生.我们写好makefile文件后,只需要一个make命令,就可以完成整个项目的编译工作,大大提高了开发效率. 也许刚开始学习编程时,你不会 ...

  4. 如何编写Makefile,一份由浅入深的Makefile全攻略

    本文转载整理自陈浩大大的文章(跟我一起写 Makefile),由于原文内容庞大,故梳理出目录结构以便于学习及查阅参考. 一.概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这 ...

  5. 如何编写makefile文件

    最近一直在学习makefile是如何编写的.       当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make ...

  6. 根据给定文件编写Makefile文件 两种方法编译

    实例一 1.分析源文件代码依赖关系 mian.c #include "test1.h" #include "test2.h" #include <stdi ...

  7. 转:教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...

  8. Linux下编写 makefile 详细教程

    原文地址: https://www.cnblogs.com/mfryf/p/3305778.html 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到make ...

  9. 为多个文件夹下的C源代码编写Makefile文件

    上一篇文章写了如何为在同一个文件夹下的C源代码,本篇文章为多个文件夹下的C源代码编写Makefile文件. 建立两个文件夹,分别为abs与src.其最终目录结构如下: 1 $ ls * 2 jun.c ...

随机推荐

  1. JS-产生随机数的几个用法!

    <script> function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.random(); ret ...

  2. centos关于vsftpd的配置、配置说明及常见问题

    一.安装vsftpd 安装yum install -y vsftpd 开机启动 chkconfig vsftpd on 启动 service vsftpd start 加入防火墙 vi /etc/sy ...

  3. WinServer 之 内网发布网站后端口映射外网访问

    内网IP只能在内网局域网访问连接,在外网是不能认识内网IP不能访问的.如有路由权限,且路由有固定公网IP,可以通过路由的端口映射,实现外网访问内网.如无路由,或路由无公网IP,需要用到第三方开放的花生 ...

  4. 代码可读性艺术在Andorid中的体现

    前言 最近接手的一些项目,不同的人编码风格迥异,类里的变量.方法的定义穿插,注释极为稀少,更有一些变量和方法的命名非常近似,例如表示播放队列的"playQueue"和表示歌单的&q ...

  5. javascript数据结构和算法 第二章 (数组) 二

    字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符切割,返回字符串数组表示. 这里有个样例: var names = [&qu ...

  6. javascript-使用el表达式获取后台传递的数据

      js获取后台数据 CreateTime--2017年5月26日16:14:14Author:Marydon 在js中使用el表达式的前提是:HTML引用js使用内联方式(即在JSP页面内部使用js ...

  7. Codeforces 276E(树状数组)

    题意:一棵树有n个节点,1是根节点,根节点的子节点是单链,然后如今有两种操作0 v x d表示距离节点v为d的节点权值都加x,操作1 v问v节点的权值,初始节点权值都是0. 题解:看了别人的题解才会的 ...

  8. Apache OFBiz 添加样式

    1.打开themes文件夹,拷贝一份样式作为自己的样式更改初始样式,我这里拷贝的是flatgrey文件夹,重新命名为qlstyle     2.在文件/ofbiz/framework/common/c ...

  9. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  10. Linux-使用 screen 管理你的远程会话

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-screen/ 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是 ...