研究给定的C语言程序组,编写相应的makefile,并执行查看结果。
主要实现:利用两个c文件结合编译输出“hello zhangsan!”字符串,进而练习makefile文件编写的方法
gcc的编译过程
Makefile语法规则
简单地讲,Makefile的作用就是让编译器知道要编译一个文件需要依赖哪些文件,同时当那些依赖文件有了改变,编译器会自动发现最终的生成文件已经过时,而重新编译相应的模块。Makefile的内容规定了整个工程的编译规则。一个工程中的许多源文件按其类型、功能、模块可能分别被放在不同的目录中,Makefile定义了一系列的规则来指定,比如哪些文件是有依赖性,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。
Makefile有其自身特定的编写格式并且遵循一定的语法规则。
目标文件:依赖文件列表 ………………………… <tab>命令列表 …………………………一、编写主函数main.c
1、输入编辑文件指令
#vi main.c
2、编写main.c文件内容为下:
include<stdio.h>
#include"name.h"
void main()
printf("hello ");
name1();
二、编写name.c文件和name.h文件
1、输入编写name.c文件指令
#vi name.c
2、name.c文件内容为下
include<stdio.h>
#include"name.h"
void name1()
printf("zhangsan!\n");
3、输入编写name.h文件指令
#vi name.h
4、编写name.h内容为下
#ifndef _name_h_
#define _name_h_
void name1();
#endif
三、编写makefile文件
1、编辑makefile文件指令
#vi makefile
2、编写makefile内容
main:main.o name.o
gcc main.o name.o -o main
main.o:main.c name.h
gcc -c main.c -o main.o
name.o:name.c name.h
gcc -c name.c -o name.o
四、编译运行
#make
#./main
运行结果如下:
五、对makefile文件进行修改
Makefile文件中除了一系列的规则,对于变量的使用也是一个很重要的内容。
Linux下的Makefile文件中可能会使用很多的变量,定义一个变量(也常称为宏定义),只要在一行的开始定义这个变量(一般使用大写,而且放在Makefile文件的顶部来定义),后面跟一个=号,=号后面即为设定的变量值。如果要引用该变量,用一个$符号来引用变量,变量名需要放在$后的()里。
make工具还有一些特殊的内部变量,它们根据每一个规则内容定义。
$@:指代当前规则下的目标文件列表。
$<:指代依赖文件列表中的第一个依赖文件。
$^:指代依赖文件列表中所有依赖文件。
$?:指代依赖文件列表中新于对应目标文件的文件列表。
1、上面两句相当于c语言中的宏定义了(如果需要用到的时候使用“(obj)”)
obj=main.o name.o
cc=gcc
2、 (1)可以修改为(2)
(1)main:main.o name.o
(2)main:$(obj)
(1)gcc main.o name.o -o main
(2)$(cc) $(obj) -o main
4、($(<)表示依赖文件的第一个文件)
(1)main.o:main.c name.h
gcc -c main.c -o main.o
(2)main.o:main.c name.h
$(cc) -c $(<) -o main.o
5、($@:指代当前规则下的目标文件列表。)
(1)name.o:name.c name.h
gcc -c name.c -o name.o
(2) name.o:name.c name.h
$(cc) -c $(<) -o $(@)
整个makefiile修改后代码如下
obj=main.o name.o
cc=gcc
main:$(obj)
$(cc) $(obj) -o main
main.o:main.c name.h
$(cc) -c $(<) -o main.o
name.o:name.c name.h
$(cc) -c name.c -o $(@)
复制代码