相关文章推荐
逆袭的领结  ·  ORA-01427: ...·  3 周前    · 
咆哮的馒头  ·  【CVPR ...·  1 年前    · 

研究给定的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)

1main:main.o name.o2main:$(obj)
1)gcc main.o name.o -o main2)$(cc) $(obj) -o main

4、($(<)表示依赖文件的第一个文件)

1main.o:main.c name.h
gcc -c main.c -o main.o2main.o:main.c name.h 
$(cc) -c $(<) -o main.o

5、($@:指代当前规则下的目标文件列表。)

1)name.o:name.c name.h
gcc -c name.c -o name.o2) 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 $(@)
复制代码
  •