`
yanfaguanli
  • 浏览: 658241 次
文章分类
社区版块
存档分类
最新评论

Linux下C语言编程基础(Makefile)

 
阅读更多




假设我们有下面这样的一个程序,源代码如下:

/* main.c */ 

#include "mytool1.h" 

#include "mytool2.h" 

int main(int argc,char **argv) 

{ 

mytool1_print("hello"); 

mytool2_print("hello"); 

} 

/* mytool1.h */ 

#ifndef _MYTOOL_1_H 

#define _MYTOOL_1_H 

void mytool1_print(char *print_str); 

#endif 

/* mytool1.c */ 

#include "mytool1.h" 

void mytool1_print(char *print_str) 

{ 

printf("This is mytool1 print %s ",print_str); 

} 

/* mytool2.h */ 

#ifndef _MYTOOL_2_H 

#define _MYTOOL_2_H 

void mytool2_print(char *print_str); 

#endif 

/* mytool2.c */ 

#include "mytool2.h" 

void mytool2_print(char *print_str) 

{ 

printf("This is mytool2 print %s ",print_str); 

}


当然由于这个程序很短,我们可以这样来编译:

gcc -c main.c 

gcc -c mytool1.c 

gcc -c mytool2.c 

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

这样的话我们也可以产生main程序,而且也不是很麻烦。但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个 SHELL脚本,让它帮我去完成不就可以了。是的对于这个程序来说,是可以起到作用的。但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?

为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make。我们只要执行以下make,就可以把上面的问题解决掉。在我们执行make之前,我们要先编写一个非常重要的文件。--Makefile。对于上面的那个程序来说,可能的一个Makefile的文件是:

# 这是上面那个程序的Makefile文件:


main:main.o mytool1.o mytool2.o 

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

main.o:main.c mytool1.h mytool2.h 

gcc -c main.c 

mytool1.o:mytool1.c mytool1.h 

gcc -c mytool1.c 

mytool2.o:mytool2.c mytool2.h 

gcc -c mytool2.c



有了这个Makefile文件,不论我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件它连理都不想去理的。

下面我们学习Makefile是如何编写的。

在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明。一般的格式是:

target:components

TAB rule

第一行表示的是依赖关系。第二行是规则。

比如说我们上面的那个Makefile文件的第二行。

main:main.o mytool1.o mytool2.o

表示我们的目标(target)main的依赖对象(components)是main.o mytool1.omytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令。就象我们的上面那个Makefile第三行所说的一样要执行 gcc-o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键

Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:

# 这是简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

mytool1.o:mytool1.c mytool1.h

gcc -c $<

mytool2.o:mytool2.c mytool2.h

gcc -c $<

经过简化后,我们的Makefile是简单了一点,不过人们有时候还想简单一点。这里我们学习一个Makefile的缺省规则

.c.o:

gcc -c $<

这个规则表示所有的 .o文件都是依赖与相应的.c文件的。例如mytool.o依赖于mytool.c这样Makefile还可以变为:

# 这是再一次简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

.c.o:

gcc -c $<

好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile的规则,可以查看相应的文档。

分享到:
评论

相关推荐

    学会Linux下C语言编程--基础知识

    本文介绍在LINUX下进行C语言编程所需要的基础知识.在文中,我们将会学到以下内容: 源程序编译 、Makefile的编写 、程序库的链接 、程序的调试 、头文件和系统求助 。

    Linux下C语言编程基础知识

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助

    Linux下C语言编程知识

    Linux下C语言编程基础知识, 这篇文章介绍在 LINUX 下进行C 语言编程所需要的基础知识。在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makefile 的编写 程序库的链接 程序的调试 头文件和系统求助

    Linux系统下C语言编程基础知识介绍

    本文将为大家介绍在LINUX下进行C语言编程所需要的基础知识。文章当中,我们将会学到以下内容: 源程序编译、Makefile的编写、程序库的链接、程序的调试、头文件和系统求助。

    Linux下面如何进行C语言编程

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助

    Linux操作系统下C语言编程入门

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助

    Linux.c语言编程入门

    本章介绍在 LINUX 下进行 C 语言编程所需要的基础知识.在这篇文章当中,我们将会 学到以下内容: 源程序编译 Makefile 的编写 程序库的链接 程序的调试 头文件和系统求助

    Linux下的C语言编程--基础知识篇.doc

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译; Makefile的编写; 程序库的链接; 程序的调试; 头文件和系统求助。

    Makefile学习

    gnU makefile linux下c语言编程基础(makefile) 跟我一起学makefile 使用makefile更新静态库 ……

    Linux下的C编程基础

    本章将带领读者学习在Linux中进行C语言编程的基本技能。学习了本章后,读者能够掌握如下内容。 熟悉Linux系统下的开发环境 熟悉Vi的基本操作 熟练Emacs的基本操作 熟悉Gcc编译器的基本原理 熟练使用Gcc编译器的常用...

    linux下C编程高效手册.htm

    这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 linux下C编程

    嵌入式高级C语言编程讲义文档

    第 1 章 Linux 基础之命令 第 2 章 c 数据类型及语句 第 3 章 数组 第 4 章 函数 第 5 章 预处理、动态库、静态库 第 6 章 指针 第 7 章 动态内存申请 第 8 章 字符串处理函数 第 9 章 结构体 第 10 章 ...

    嵌入式Linux C编程入门(第2版) PPT

    2.1.3 嵌入式linux c语言编程环境 34 2.2 嵌入式linux编辑器vi的使用 35 2.2.1 vi的基本模式 35 2.2.2 vi的基本操作 36 2.2.3 vi的使用实例分析 40 2.3 嵌入式linux编译器gcc的使用 41 2.3.1 gcc...

    嵌入式Linux应用程序开发标准教程(第2版全)

    3.1.2 Linux下C语言编程环境概述 3.2 常用编辑器 3.2.1 进入vi 3.2.2 初探emacs 3.3 gcc编译器 3.3.1 gcc编译流程解析 3.3.2 gcc编译选项分析 3.4 gdb调试器 3.4.1 gdb使用流程 3.4.2 gdb基本命令 3.5 make工程管理...

    《Linux C编程从初学到精通 %shdk.rar

    详细介绍linux c编程,从如何安装linux c语言基础开始,到linux下的gcc makefile 提高篇:文件IO,进程,信号,网络编程,图形界面编程,最后还有五个实战历程

    linux基础学习+进程+信号+线程+线程锁+进程锁+信号量+网络socket套接字编程

    ①Linux基础学习:文件类命令、压缩命令、进程命令、服务器搭建、用户管理、vim学习、gcc/g++编译、linux静态库/动态库、gdb学习、makefile基础学习、C语言文件操作类函数、C语言目录操作函数等; ②linux系统编程...

Global site tag (gtag.js) - Google Analytics