linux初学习--makefile文件编写--多模块编译

本文详细介绍如何通过两个C文件结合编译输出“hellozhangsan!”字符串,深入讲解Makefile编写方法,涵盖gcc编译过程及Makefile语法规则。通过实际案例,读者将学会如何定义编译规则,理解依赖关系,以及如何使用变量和特殊内部变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

~

四、编译运行

1、编译

#make

2、运行

#./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)

3、同上
(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 $(@)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永栀哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值