【Linux开发技术之程序构建】Makefile学习(不断更新)

 作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/ 
  

1.入门篇

1)Makefile的作用:帮助编译多文件。

2)基本编写示例:以如下四个文件为例

//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);
} 

对应进行编译构建的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 的本质是参与构建的源代码之间依赖关系和编译方法进行说明。一般采用的格式如下:

target: components
TAB rule

第一行表示的是依赖关系.  第二行是规则,使用TAB 键进行

main:main.o mytool1.o mytool2.o 就是所谓的依赖关系,实际上是一种庖丁解牛的方式,建议在纸上画好关系依赖图,如本例:

main
---main.o--(main.c,mytool1.h,mytool2.h)
|
mytool2.o--(mytool2.c,mytool2.h)
|
mytool1.o--(mytool1.c,mytool1.h)

而gcc -o main main.o mytool1.o mytool2.o 就是所谓的规则。

3)简化

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件,使用替代规则可以简写上例如下:

main:main.o mytool1.o mytool2.o
	gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h
	gcc -c $<

mytool1.o:mytool1.cmytool1.h
	gcc -c $<

mytool2.o:mytool2.cmytool2.h
	gcc -c $<

如果有规律的命名规则,则可以简写上例如下:

main:main.o mytool1.o mytool2.o
	gcc -o $@ $^
..c.o:
	gcc -c $<


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

原文地址:https://www.cnblogs.com/gnuhpc/p/2316090.html