//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. Ubuntu - 硬盘分区、格式化、自动挂载配置

    Ubuntu系统的硬盘空间不够用了,需要增加新的硬盘扩容.将硬盘分区.格式化.自动挂载配置的整个过程记下来,备忘. 运行环境 | Enviroment Ubuntu 10.10 一.硬盘分区 | Ha ...

  2. matplotlib绘制常用统计图

    常见统计图:单条折线图.多条折线图.直方图.柱状图.饼状图 #!/usr/bin/python # -*- coding: utf-8 -*- import numpy as np import ma ...

  3. CentOS6.8 4.4.43内核 安装PF_RING

    环境: 系统:CentOS 6.8 内核版本:4.4.43 PF_RING版本:6.9.0 编译PF_RING需要内核源码,由于我的机器上只有4.4.43版本的modules和4.4.43的源码,并没 ...

  4. intellij idea使用maven本地仓库及修改本地仓库路径

    什么maven本地仓库,默认是用户目录下的.m2/repository这个文件. idea是自带maven插件的不用我们再,怎么把依赖包下载到我们的本地仓库呢?一般是idea默认了路径,而且idea是 ...

  5. 快速把web项目部署到weblogic上

    转自:http://weijie.blog.51cto.com/340746/90420/ weblogic简介         BEA WebLogic是用于开发.集成.部署和管理大型分布式Web应 ...

  6. RTP Tools

    RTP Tools (Version 1.20) https://wiki.wireshark.org/RTP_statistics Here is a small example: Install ...

  7. JMeter 八:录制脚本--使用Jmeter自带的代理服务器

    参考:http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf http://jmeter.apache.org/userma ...

  8. 运用Unity实现依赖注入[有参构造注入]

    上一篇章讲到关于使用Unity实现依赖注入的简单功能,针对有博友提出关于有参构造注入的问题; 本文同样通过一个实例来讲解如何实现此功能,文中一些分层讲解可以看上一文章(运用Unity实现依赖注入[结合 ...

  9. 一个编译可执行jar包 jar包中不包含resources下config.properties且可以读到config.properties文件且classpath中有当前路径的pom

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  10. 微信小程序之趣闻

    代码地址如下:http://www.demodashi.com/demo/13433.html 前言 小程序 的火热程度我就不多说了,我之前对这个就蛮有兴趣的,于是花了大概5天的时间,完成了 学习-入 ...