IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Makefile -> 正文阅读

[系统运维]Makefile

一、前言

在linux下一般使用Makefile来完成编译,而Makefile相当于脚本,它可以调用gcc、clang等编译器。但是Makefile有一套它自己的规则,而且与bash不太一样,以下介绍该规则。

二、伪目标

现在有以下main.c

#include "stdio.h"
void main() {
	printf("hello makefile\r\n");
}

对其编写的Makefile如下

all: 
	gcc -o hello main.c 
clean:
	rm -rf *.o hello

结果如下

使用make all命令可以编译出可执行文件hello,使用make clean可以把hello删除。

伪目标可以调用一行bash命令。

三、目标和依赖

现在将Makefile改一下。

main.o:main.c
	gcc -c main.c
all:
	gcc main.o -o hello
clean:
	rm -rf *.o hello

其中main.o:main.c,main.o就是目标文件,也就是需要用main.c编译出来的。而main.c就是依赖文件,也就是被编译的源码。

此时,使用make、make all命令同样可以编译出可执行文件hello。

四、变量

想要复用Makefile里面的代码,就不能直接写死文件名等,那就需要用到变量。再修改Makefile。

TAR = hello
DEP = main.c
OBJ = main.o
CC := gcc

$(OBJ):$(DEP)
	$(CC) -c $(DEP)
all:
	$(CC) $(OBJ) -o $(TAR)
clean:
	rm -rf $(OBJ) $(TAR)

TAR = hello,就把hello命名为变量TAR,后面使用该变量时,需要写成$(TAR)。

然后用变量对下面的命名进行替换,那么如果要换个工程,也是简单修改就能使用了。

五、通配符

TAR = hello
OBJ = main.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)
*.o:*.c
	$(CC) -c *.c -o *.o
clean:
	rm -rf $(OBJ) $(TAR)

可以使用通配符*,来匹配所有.o或者.c文件。

TAR = hello
OBJ = main.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)
$@:$^
	$(CC) -c $^ -o $@
clean:
	rm -rf $(OBJ) $(TAR)

也可以写成$@代表所有的目标文件,相当于*.o,而$^则代表所有的依赖文件,相当于*.c。

六、多文件编译

现在有main.c

#include "disp.h"
void main() {
	printf("hello makefile\r\n");
	disp();
}

disp.h

#include "stdio.h"
void disp();

disp.c

#include "disp.h"
void disp() {
	printf("disp()\r\n");
}

Makefile

TAR = hello
OBJ = main.o disp.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)
$@:$^
	$(CC) -c $^ -o $@
clean:
	rm -rf $(OBJ) $(TAR)

结果如下

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:36:34  更:2022-02-19 01:37:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:35:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码