首页 > 系统相关 >Linux - Makefile

Linux - Makefile

时间:2023-01-06 11:44:31浏览次数:42  
标签:%. sub make Makefile add CFLAGS Linux main

1. make工具简介

make工具是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具 。而这个makefile文件类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。

另外make的一个好处就是当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,因此,为编译完最终的目标(可执行文件)节省了大量的时间提高工作连贯性。比如一个工程下面有A.c 、B.c、 B.c三个文件,在make生成可执行目标文件之后,改动了A.c,则再次make时,只会执行有关A.c处理动作,其它的不处理。

学习make工具,需要明白三个概念:目标、依赖、处理动作。 makefile所要进行的主要内容是明确目标、明确目标所依赖的内容、明确依赖条件满足时应该执行对应的处理动作。例如我们最终要实现a这个目标,但是需要依赖b,而b依赖于c的存在,则可以描述为:

a:b
    cmdbtoa
b:c
    cmdctob

“:”代表依赖,另外每个处理动作之前都要用tab键分隔。 上述四行的意思是:a依赖于b,而处理cmdbtoa;b依赖于c,而处理cmdctob。

 

2. 语法规则

Makefile 的框架是由规则构成的。make 命令执行时先在 Makefile 文件中查找各种规则,对各种规则进行解析后运行规则。规则的基本格式为:

目标 ... : 依赖 ...
    命令1
    命令2
    . . .

解释:

总目标:总目标的依赖
    使用依赖生成目标的命令
分支目标:分支目标的依赖
    使用依赖生成目标的命令

 

3. 使用方法

假如有这些头文件和源文件:add.c , add.h , main.c , sub.c , sub.h

 

3.1 基础版

新建一个文件,命名为makefile,文件内容如下(注意要用tab来分隔处理动作指令):

test.exe:main.o add.o sub.o
    gcc main.o add.o sub.o -o test.exe
main.o:main.c
    gcc -c main.c -o main.o
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
​
clean:
    rm -rf *.o test.exe
​

 

make:然后在终端内输入make指令编译工程:

 

make clean:删除掉所有.o以及可执行文件,当修改了某一个源文件使用该指令清除旧的文件。在终端输入“make clean”实现:

 

3.2 变量版

$符号表示取变量的值,当变量名多于一个字符时,使用"( )" $符的其他用法:

$^ 表示所有的依赖文件
$@ 表示生成的目标文件
$< 代表第一个依赖文件

makefile内容如下:

OBJS = main.o add.o sub.o
G = gcc
CFLAGS = -Wall -O -g
 
test.exe:$(OBJS)
    $(G) $(OBJS) -o test.exe
main.o:main.c add.h sub.h
    $(G) $(CFLAGS) -c main.c
add.o:add.c add.h
    $(G) $(CFLAGS) -c add.c
sub.o:sub.c sub.h
    $(G) $(CFLAGS) -c sub.c
 
clean:
    rm -rf *.o test.exe
​

在这个makefile中使用了变量,变量的格式是“varName = content”;若要引用这个变量,只需要用$ 即可,$(varName)。

CFLAGS = -wall -o -g 配置编译器设置,并把它赋值给CFLAGS变量

-wall:输出所有警告信息

-o:在编译时进行优化

-g:表示编译debug版本

使用make后生成文件同上:

 

这样写的Makefile比较简单,但是缺点显著,每添加一个.c文件,就需要修改Makefile文件。

 

3.3 函数版

makefile内容如下:

C = gcc
G = g++
CFLAGS = -Wall -O -g
TARGET = ./test.exe
 
%.o:%.c
    $(C) $(CFLAGS) -c $< -o $@
 
%.o:%.cpp
    $(G) $(CFLAGS) -c $< -o $@
 
SOURCES = $(wildcard *.c *.cpp)
 
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
 
$(TARGET):$(OBJS)
    $(G) $(OBJS) -o $(TARGET)
    chmod a+x $(TARGET)
 
clean:
    rm -rf *.o test.exe
​
​

%.o:%.c $© $(CFLAGS) -c $< -o $@

%.o:%.cpp $(G) $(CFLAGS) -c $< -o $@

表示把所有的.c、.cpp文件编译成.o文件。

SOURCES = $(wildcard *.c *.cpp) 表示产生一个所有以.c、.cpp结尾的文件列表,然后存入变量SOURCES里。

OBJS = $ (patsubst %.c,%.o,$ (patsubst %.cpp,%.o,$(SOURCES))) 把SOURCES文件列表中所有.cpp变成.o、.c变成.o,然后形成一个新的列表,存入OBJS变量。

$ @扩展成当前规则的目的文件名,$ <扩展成依靠列表中的第一个依靠文件,$^扩展成整个依靠的列表(除掉里面所有重复的文件名)。

chmod a+x $(TARGET) 表示把firstTest强制变成可执行文件。

使用make后生成文件同上:

标签:%.,sub,make,Makefile,add,CFLAGS,Linux,main
From: https://www.cnblogs.com/zhuchunlin/p/17029993.html

相关文章

  • linux 常用工具
    hexdump-Ctcpdump-ieth0host192.168.0.116-w1.cap-c2000 测速工具:iPerfiperf是一个网络性能测试工具,它可以测试TCP和UDP带宽质量,可以测量最大TCP带......
  • Linux清理磁盘
    1、查看磁盘信息命令:df-lh  磁盘空间已被占满2、定位最大文件目录进入到根目录,命令:cd/查看当前目录哪个文件占用空间最大,命令:du-h--max-depth=1  看到./......
  • Linux 文件基本属性
    Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定......
  • linux指令chown
    原文地址:https://blog.csdn.net/cnds123321/article/details/124957014chown 是 changeowner 的缩写语法该命令的语法如下:chown[-cfhvR][--help][--version]us......
  • 基于Linux的Buildroot 制作根文件系统(rootfs)【转】
    参考:https://blog.csdn.net/qq_39721016/article/details/123876398 、https://www.jianshu.com/p/a461adda7a43仅供参考学习使用要构建自己的开发板,首先要创......
  • Linux 添加seata守护进程
    1、编写启动文件将启动脚本放在~seata/bin/目录下vim/usr/local/seata/bin/startup.sh添加以下内容【#!/bin/bashsleep3#根据自己的java家目录填写exportJAVA_H......
  • linux问题
    问题:PTYallocationrequestfailedonchannel0系统当前使用的虚拟终端pty的数量已经达到了系统允许的上限。解决方法:关闭pts连接root执行ps-ef|greppts找到......
  • linux安装PHP5.6.30
    原文链接:https://blog.csdn.net/m0_55116875/article/details/121981413前言:当搭建PHP项目时,如果在搭建环境时缺少freetype,会导致访问nginx页面时,登录界面验证码无法成功......
  • linux定时任务
    1.Crontab命令文件保存在/var/spool/cron下crontab[-u<用户名称>][配置文件]或crontab{-l|-r|-e}-u#<用户名称>是指设定指定<用户名称>的定时任务,这个......
  • 《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第四章 开发环境搭建​
    开发环境搭建​要进行ZYNQ开发肯定要先搭建好开发环境,我们在开始学习STM32的时候肯定需要安装一堆的软件,比如MDK、IAR、串口调试助手等等,这个就是STM32的开发环境搭建。同样......