【linux环境下】【C语言编译】【使用makefile】【详细版】

前言

      这是一个简单地演示C语言如何使用makefile在linux下进行编译。

目录

前言

一、C语言编译

1、编写add.c文件

2、编写sub.c文件

3、编写test.h文件

4、编写makefile文件

5、执行makefile文件

6、高级一点的makefile文件写法

7、makefile模板

一、C语言编译

整个流程:

1、编写add.c文件

在命令行写入:

vi add.c

进入vi编辑模式,写入:

#include "test.h"
#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int main()
{
    printf(" 2 + 3 = %d\n", add(2, 3));
    printf(" 2 - 3 = %d\n", sub(2, 3));
    return 1;
}

按Esc键退出vi的编辑模式,进入命令行模式,再输入

:wq

 即保存并退出

2、编写sub.c文件

在命令行写入:

vi sub.c

进入vi编辑模式,写入:

#include "test.h"

int sub(int a, int b)
{
    return a - b;
}

按Esc键退出vi的编辑模式,进入命令行模式,再输入

:wq

即保存并退出

3、编写test.h文件

在命令行写入:

vi test.h

进入vi编辑模式,写入:

#ifndef _TEST_H
#define _TEST_H

int add(int a, int b);
int sub(int a, int b);

#endif

按Esc键退出vi的编辑模式,进入命令行模式,再输入

:wq

即保存并退出

4、编写makefile文件

在命令行写入:

vi makefile

进入vi编辑模式,写入:


test: add.o sub.o
	gcc -o test add.o sub.o

add.o: add.c test.h
	gcc -c add.c

sub.o: sub.c test.h
	gcc -c sub.c    

clean:
	rm -rf test
	rm -rf *.o

makefile文件

  • 好处:一次编写,终身受益
  • 命名规则:makefile、Makefile
  • 三要素:1、目标;2、依赖;3、规则命令
  • 写法:
目标:依赖
(tab键)规则命令

 依赖文件如果比目标文件新,则重新生成目标

按Esc键退出vi的编辑模式,进入命令行模式,再输入

:wq

即保存并退出

5、执行makefile文件

在命令行输入:

make

会得到如下结果:

用ls命令查看一下:

我们会发现其中有一个test目标文件,我们执行下test,看下结果:

 执行一下make clean,我们会发现没有了.o和test文件

6、高级一点的makefile文件写法

(1)介绍两个重要的函数:

  • widcard:可以进行文件匹配
  • patsubst:内容的替换 

(2)使用变量的方法:$(变量)

(3)$的搭配用法:

  • $@:目标
  • $^:全部依赖
  • $<:第一个依赖
  • $?:第一个变化的依赖
SrcFiles=$(wildcard *.c)                   #注释:可以得到所有的.c文件
ObjFiles=$(patsubst %.c,%.o,$(SrcFiles))   #把所有的.c文件替换成.o文件

app:$(ObjFiles)
    gcc -o app $^

all:$(ObjFiles)    #伪目标

%.o:%.c               #把每一个.c生成.o      
    gcc -o $@ $^  

.RHONY:clean       #防止有歧义

clean:
    rm -f all

7、makefile模板

SrcFiles=$(wildcard *.c) #得到所有的.c文件
ObjFiles=$(patsubst %.c,%,$(SrcFiles))  #把所有的.c替换成.o文件

#格式
#目标:依赖
#	规则命令  (gcc -o 目标 依赖)

#  $@:目标
#  $^:全部依赖
#  $<:第一个依赖
#  $?:第一个变化

all:$(ObjFiles)

#使所有的.c文件分别生成对应的.o文件
%:%.c
	gcc -o $@ $^ 

#  -I./include(指定包含的头文件路径)
#  -lpthread(编译线程时需要)
#  -g(调试时需要)

.PHONY:clean #防止有歧义

#清理
clean:
	-rm -f $(ObjFiles)

  • 13
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烊萌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值