linux下编程使用makefile文件

在谈makefile之前,先来看看下面几个小程序:

程序1:mytool1.c

#include"mytool1.h"
#include"stdio.h"
void mytool1_print(char* print_str)
{printf("This is mytool1 print %s\n", print_str);
}

程序2:mytool1.h

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char*);
#endif

程序3;mytool2.c

#include"mytool2.h"
#include"stdio.h"
void mytool2_print(char* print_str)
{printf("This is mytool2 print %s\n", print_str);
}

程序4:mytool2.h

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char* );
#endif

程序5:main.c

#include"mytool1.h"
#include"mytool2.h"
int main(void)
{mytool1_print("hello 1");mytool2_print("hello 2");return 0;
}

现在我们要运行main.c来打印输出
This is mytool1 print hello 1
This is mytool1 print hello 2

如图所示,所有源文件:

我们先按照常用的编译做法,对五个文件分别编译。
linux下的c/c++编译器是 gcc 和 g++, 不过,gcc使用的人比较多,这两个都能便于c和c++文件,下面以gcc编译为样例。

gcc 的编译格式大致为:gcc -c 源文件  -o 目标文件

方式不唯一,其中“ c ”的含义是英文单词 compile 编译的缩写,” o “的含义是英文单词out输出的缩写, 如果没有指定生成目标文件,编译器默认生成跟源文件同名的编译文件。

编译上面的例子:
gcc -c mytool1.c -o mytool.o,这个命令是编译mytool1.c文件生成目标mytool1.o文件,这里生成文件mytool1其实可以写成任意的符号或者名称,如果写成gcc -c mytool1.c,系统默认生成mytool1.o文件。

以下,是编译步骤:

gcc -c mytool1.c
gcc -c mytool2.c
gcc -c main.c

下图是编译过程和结果。

1.分别编译三个源文件

2.gcc main.o  -o  main  mytool1.o mytool2.o

这句命令是将三个.o文件链接成可执行的main 程序。输入./main执行程序。

通过上面发现,生成main文件,我们需要编译了三次,太耗费时间。使用makefile编程,可进行大量编译。

1、在上面程序的同一路径建立一个makefile文件,不加后缀名,makefile内容如下所示。

这里的mian是最终的可执行程序,名字随便写都行。我写成了mian。

特别注意:gcc前面都是带有一个tab键的空格,这个不能少,少了就出错。尽量不要复制这几行代码,我的代码可能空格数不对,自己手到进去一个table键就行了。

mian:main.o mytool1.o mytool2.ogcc -o  mian  main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytoo1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c

makefile内容的解释:

每两行为一句,前一行给出生成的文件名,和所需要的文件,后一行给出方法。

mian:main.o mytool1.o mytool2.ogcc -o mian main.o mytool1.o mytool2.o

上面的代码解释为:

第一行解释:main 程序的生成是依赖main.o mytool1.o mytool2.o文件的。这行给出的是依赖关系。

第二行解释:这行给出了生成main程序的方法,方法是通过gcc -c main.o mytool1.o mytool2.o方法来生成的,
下面几行就不讲了,原理都是一样,先给出文件的依赖关系,再给出方法。

编写好makefile, 用输入命令"  make "进行大量编译,执行的顺序还是跟上面一样,截图如下:

2.上面的makefile其实还是不够简练,,我们发现里面反复出现了main.o mytool.o mytool2.o, 于是我们可以找一个变量名来代替它,下面代替名是objects;

下面是精简后的makefile:内容如下:

objects=main.o mytool1.o mytool2.o
main:$(objects)gcc -o mian $(objects)
main.o:main.c mytool1.h mytool2.hgcc -c main.c mytool1.h mytool2.h
mytool1.o:mytool1.c mytool1.hgcc -c mytool1.c
mytool2.o:mytool2.c mytool2.hgcc -c mytool2.c
clean:
rm *.h.gchrm *.o

每个gcc都必须一个tab键空格。还要注意图中的mian和$之间是有空格的,不加空格,编译会出错。
clean:

rm *.h.gch
    rm  *.o
上面的意思是清楚生成的.o文件和.h.gch文件,这些文件是中间文件,可以删除。

输入make clean命令就可以清除全部.o文件。

linux下的makefile编程相关推荐

  1. linux下的c编程

    vi编译器简介 vi的三种模式,分别为命令行模式,插入模式以及底行模式,这里游客去看,这里提供好几个小技巧:G表示移动到文件末尾nG表示移动到第几行 gcc优化选项 gcc可以对代码进行优化,他可以通 ...

  2. linux c++编程教程,Linux下的C++编程入门教程.ppt

    <Linux下的C++编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C++编程入门教程.ppt(14页珍藏版)>请在人人文库网上搜索. 1.Linux下 ...

  3. Linux下C语言编程

    第1章 Linux下C语言编程简介 本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Li ...

  4. 初识Linux下C语言编程

    本章将简要介绍一下什么是Linux,C语言的特点,程序开发的预备知识,Linux下C语言开发的环境,程序设计的特点和原则以及编码风格等.通过本章的学习,可以对在Linux下使用C语言编程有一个基本的了 ...

  5. linux下的c 编程入门教程,Linux下的C编程入门教程.ppt

    <Linux下的C编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C编程入门教程.ppt(14页珍藏版)>请在装配图网上搜索. 1.Linux下c+编程, ...

  6. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  7. Linux下的C编程实战(转载)

    http://www.cnblogs.com/alexusli/archive/2008/10/24/1318736.html Linux下的C编程实战(转载) (转自)http://www.cnbl ...

  8. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

  9. linux c语言工具,Linux下C语言编程环境的工具.doc

    Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 Linux下C语言编程环境的工具 要想在Linux下进行C语言编程,首先得搭建好一个编程环境.这里分别说明一下几个非常有用的软件包. ...

最新文章

  1. 读书笔记 23种设计模式总结
  2. php5.6non thread safe 区别,PHP版本Non Thread Safe和Thread Safe如何选择?区别是什么?
  3. 小新pro13睡眠后无法唤醒_轻薄的外表狂野的心——联想小新 Pro13 测评
  4. Shell编程 之 for 循环
  5. REST风格笔记【简介篇】
  6. Hessian Binary Web Service Protocol远程接口调用入门
  7. oracle varchar2改成大字段类型clob,读取大字段内容
  8. Dubbo的负载均衡、集群容错、服务降级等机制详解
  9. 二维数组作数据源填充到repeater
  10. linux下NIS服务的配置
  11. mysql批量修改表中大小写_SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写...
  12. Java新闻发布系统源码
  13. 纵横公路造价软件学习_纵横公路造价软件教程
  14. win10关机后cpu风扇还在转_win10系统关机后风扇还转的解决方法
  15. 360 和 qq 之争
  16. 自己动手写 Docker 系列文章总览
  17. 火狐Firefox安装屏蔽广告插件ublock origin方法
  18. 移动云Mas发送普通短信和模板短信
  19. 轻办公之Windows下的可道云
  20. 什么是智能会议平板?

热门文章

  1. HDU 1711 -Number Sequence(KMP)
  2. ACM入门之【树状数组习题】
  3. Codeforces Round #777 (Div. 2)【未完结】
  4. priority_queue的常见用法详解
  5. C语言经典算法 21-30
  6. Dubbo标签解析原理
  7. python数据储存_五种使用python储存数据的方式
  8. Spring 为啥默认把 bean 设计成单例的?
  9. maven私服-详细部署搭建笔记
  10. java基础集合类之set