//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. [Python爬虫] 之十三:Selenium +phantomjs抓取活动树会议活动数据

    抓取活动树网站中会议活动数据(http://www.huodongshu.com/html/index.html) 具体的思路是[Python爬虫] 之十一中抓取活动行网站的类似,都是用多线程来抓取, ...

  2. Linux环境Nginx安装与调试以及PHP安装

    linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 1.编译安装Nginx 官网:http://wiki.nginx.org/Instal ...

  3. ci框架(二)

    自定义SQL语句                                                                             当提供的API满足不了我们对S ...

  4. sparkStreaming读取kafka的两种方式

    概述 Spark Streaming 支持多种实时输入源数据的读取,其中包括Kafka.flume.socket流等等.除了Kafka以外的实时输入源,由于我们的业务场景没有涉及,在此将不会讨论.本篇 ...

  5. Hadoop Maven pom文件示例

    Hadoop Maven pom文件示例 @(Hadoop) <?xml version="1.0" encoding="UTF-8"?> < ...

  6. 记一次vue2路由参数传递this指针问题

    需要船体一个data()内的对象到另一个页面. <player-card v-for="(note, key) in sortedtNodes" :imgurl=" ...

  7. 转: ios的关于autolayout的设计与实现

    http://www.taijicoder.com/2015/12/12/iOS-Layout-and-Masnory/

  8. linux mysql 更改MySQL数据库目录位置

    MySQL默认的数据文件存储目录为/var/lib/mysql.假如要把目录移到/home/data下需要进行下面几步: 1.home目录下建立data目录 cd /home mkdir data 2 ...

  9. Node.js mm131图片批量下载爬虫1.00 iconv协助转码

    //====================================================== // mm131图片批量下载爬虫1.00 // 2017年11月15日 //===== ...

  10. Node.js umei图片批量下载Node.js爬虫1.00

    这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...