1. //a.h,包含头文件stdio.h,并且定义一个函数print
  2. #include<stdio.h>
  3. void print();
  4. //b.c,包含头文件a.h,然后就可以写print函数的内容了
  5. #include"a.h"
  6. void print(){
  7. printf("who are you\n");
  8. }
  9. //c.c,包含头文件a.h,调用print函数
  10. #include"a.h"
  11. int main(){
  12. print();
  13. return 0;
  14. }

下面是Makefile 固定命名,记住这些文件全部在同一文件夹下,全部编写完成后,执行make命令就会自动执行Makefile了,


  1. hello:c.o b.o //其中hello是目标文件,c.o和b.o是依赖文件,需要这两个文件才能生成hello,因为现在还没有c.o文件,所以跳到c.o:c.c a.h那里,然后执行gcc -c c.c 执行完成后又返回该条语句,发现也没有b.o,所以跳到b.o:b.c a.h
  2. gcc -o hello c.o b.o //这个是shell命令
  3. c.o:c.c a.h
  4. gcc -c c.c //其中gcc -c c.c是指编译生产c.o(改成gcc -o c.o c.c会报错)
  5. b.o:b.c a.h
  6. gcc -c b.c
  7. clean: //执行make clean会执行下面的语句
  8. rm hello c.o b.o

执行效果如下

  1. [root@bogon bp]# ls
  2. a.h b.c c.c Makefile
  3. [root@bogon bp]# make
  4. gcc -c c.c
  5. gcc -c b.c
  6. gcc -o hello c.o b.o
  7. [root@bogon bp]# ls
  8. a.h b.c b.o c.c c.o hello Makefile
  9. [root@bogon bp]# ./hello
  10. who are you

改进后的方法,只需要修改Makefile

  1. [root@bogon bp]# cat Makefile
  2. objects=c.o b.o 相当于C语言的宏定义变量
  3. hello:c.o b.o
  4. gcc -o hello $(objects)
  5. c.o:c.c a.h
  6. gcc -c c.c
  7. b.o:b.c a.h
  8. gcc -c b.c
  9. clean:
  10. rm hello $(objects)

我们还能更精简这个过程,也是只修改Makefile

  1. [root@bogon bp]# make
  2. cc -c -o c.o c.c
  3. cc -c -o b.o b.c
  4. gcc -o hello c.o b.o
  5. [root@bogon bp]# ls
  6. a.h b.c b.o c.c c.o hello Makefile
  7. [root@bogon bp]# ./hello
  8. who are you
  9. [root@bogon bp]# cat Makefile
  10. objects=c.o b.o
  11. hello:c.o b.o
  12. gcc -o hello $(objects)
  13. $(bojects):a.h 因为c.ob.o都依赖a.h
  14. c.o:c.c 可以省略掉gcc
  15. b.o:b.c
  16. clean:
  17. rm hello $(objects)
  18. [root@bogon bp]#

上面是我自己总结写的,原文如下http://www.cnblogs.com/sld666666/archive/2010/04/08/1707789.html

进行内核编译的时候make会多两个选项,-C和-M.

  1. 其中-C $(KDIR) 指明跳转到内核源码目录下读取那里的MakefileM=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile

makefile——小试牛刀的更多相关文章

  1. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  2. Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点.上章是使用了Microsof ...

  3. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  4. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...

  5. 简单编写Makefile

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

  6. [转]Linux中configure/makefile

    本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...

  7. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  8. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  9. 实例:对2个Makefile的备注

    实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...

随机推荐

  1. flask 开启多线程

    app.run(debug=True, threaded=True)

  2. 读书笔记 C#事件event浅析(一)

    在C#中,所谓event事件,就是一种特殊的委托.如果要声明事件,首先就要声明一个相对应的委托类型.按照流程来说,事件相当于委托类型往上升了一级似的,我是这样认为的. //1.先声明委托类型 publ ...

  3. PC/FORTH 循环

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  4. java 2D图形绘制

    package jisuan; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; imp ...

  5. Linux 目录配置标准:FHS

    目录 应放置内容 /bin 和/user/目录下的/bin/都是用来保存的系统命令 /sbin 和/user/目录下的/sbin是用来保存root的系统命令 /boot 这个目录主要放置开机所用的文件 ...

  6. 自定义String

    // ShStringNew.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #inclu ...

  7. DevExpress v18.1新版亮点——XAF篇(二)

    用户界面套包DevExpress v18.1日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress eXpressApp Framework(XAF) v18.1 ...

  8. centos7 安装jdk8 bash脚本 并配置环境变量

    #!/bin/bash #安装java脚本 if type -p java; then echo 'java已安装.' exit else echo '开始安装java...' wget --no-c ...

  9. dubbo的几种配置方式(转)

    昨天刚接触公司dubbo,发现公司中项目里面的spring-dubbo-privider的dubbo中<dubbo:application name=""/>和< ...

  10. ansible暂停模块

    pause 在playbook执行的过程中暂停一定时间或者提示用户进行某些操作 常用参数: minutes:暂停多少分钟 seconds:暂停多少秒 prompt:打印一串信息提示用户操作 示例: - ...