首页 > 系统相关 >[Linux 高并发服务器]Makefile

[Linux 高并发服务器]Makefile

时间:2022-11-25 19:41:33浏览次数:36  
标签:文件 %. sub Makefile add Linux 服务器 main


[Linux 高并发服务器]Makefile

[Linux 高并发服务器]Makefile

  • ​​[Linux 高并发服务器]Makefile​​
  • ​​什么是Makefile​​
  • ​​文件命名和规则​​
  • ​​Makefile工作原理​​
  • ​​一、命令在执行之前,需要先检查依赖是否存在​​
  • ​​二、检测更新在执行规则中的命令时,会比较目标和依赖文件的时间​​
  • ​​变量​​
  • ​​自定义变量​​
  • ​​预定义变量​​
  • ​​获取变量的值​​
  • ​​模式匹配​​
  • ​​函数​​
  • ​​函数1​​
  • ​​函数2​​

什么是Makefile

Makefile 文件定义了一系列的规则来指定那些文件需要先编译,那些文件需要后编译,哪些文件需要重新编译,甚至于更复杂的操作。
Makefile带来的好处就是自动化编译,一旦写好,只需要一个make命令,整个工程就完全自动编译。make是一个命令工具,解释Makefile文件中指令的命令工具
大多数IDE自带make,Linux下的GNU就也有

文件命名和规则

命名:
makefile或者Makefile
规则:
一个Makefile文件可以有一个或多个规则

目标...:依赖...
命令(shell命令)
...

​目标:​​​最终要生成的文件(伪目标除外)
​​​依赖:​​​生成目标所需要的文件或是目标
​​​命令:​​通过执行命令对依赖操作生成目标(命令前必须TAB缩进)

Makefile 中的其他规则一般都是为第一条规则服务的

app:sub.c add.c main.c
gcc sub.c add.c main.c -o app

Makefile工作原理

一、命令在执行之前,需要先检查依赖是否存在

如果存在执行这个命令
如果不存在,向下检查其他的规则,看有没有一个规则使用来生成这个依赖的
如果找到了,则执行该规则中的命令

app:sub.o add.o main.o
gcc sub.o add.o main.o -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
main.o:main.c
gcc -c main.c -o main.o

注意,这么写比上一个写法要好,否则单个更新了就要全部重新编译

[Linux 高并发服务器]Makefile_字符串

二、检测更新在执行规则中的命令时,会比较目标和依赖文件的时间

如果依赖的时间比目标时间玩,需要重新生成目标
如果依赖的时间比目标时间早,不需要重新生成目标,对应规则中的命令也不需要被执行

变量

自定义变量

变量名=变量值

var=hello

预定义变量

​AR:​​​归档维护程序的名称,默认值为ar
​​​CC:​​​C编译器的名称,默认值为cc
​​​CXX:​​C++编译器的名称,默认值为g++

下面三个自动变量,只能在规则的命令中使用

​$@:​​​目标的完整名称
​​​$<:​​​第一个依赖文件的名称
​​​$^:​​所有的依赖文件

获取变量的值

​$(变量名)​

通过上述知识对Makefile文件进行简化

src=sub.o add.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
main.o:main.c
gcc -c main.c -o main.o

模式匹配

虽然Makefile通过自定义变量的方式简化了,但是下面的部分还是显得复杂

sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
main.o:main.c
gcc -c main.c -o main.o

我们可以采用模式匹配的方式继续简化Makefile文件

%.o:%.c
$(CC) -c $< -o $@

​%​​​通配符匹配字符串,两个​​%​​匹配的是同一个字符串

src=sub.o add.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
%.o:%.c
$(CC) -c $< -o $@

如果第一个规则的依赖没有被生成,那么会通过下一个规则的模式匹配找到生成依赖的规则

函数

Makefile文件通过通配符得到了进一步优化,但是有个问题,如果​​.o​​文件太多了,那么src就会很长,有没有办法解决这点的呢?

我们可以使用函数来对他进行优化

函数1

$(wildcard PATTERN...)

​功能:​​​获取指定目录下指定类型的文件列表
​​​参数:​​​PATTERN指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
​​​返回:​​得到若干个文件的文件列表,文件名之间使用空格间隔

$(wildcard *.c ./sub/*.c)

返回值:a.c b.c c.c d.c e.c f.c

优化后的Makefile文件

src=$(wildcard ./*.c)
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
%.o:%.c
$(CC) -c $< -o $@

函数2

$(patsubst <pattern>,<replacement>,<text>)

​功能​​​查找​​<text>​​​中的单词(单词以“空格”、“TAB”、“回音“、“换行”分隔)是否符合模式​​<pattern>​​​,如果匹配就用​​<replacement>​​替换

​<pattern>​​可以包括通配符%表示任意长度字符串,可以\来转化转义字符

​返回​​函数返回替换后的字符串

$(patsubst %.c,%.o,x.c bar.c)

返回值x.o bar.o

src=$(wildcard ./*.c)
objs=$(patsubst %.c, %.o, $(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@

clean:
rm $(objs) -f

使用​​make clean​​命令执行删除.o文件的命令


标签:文件,%.,sub,Makefile,add,Linux,服务器,main
From: https://blog.51cto.com/u_15891800/5887532

相关文章

  • [Linux 高并发服务器]制作静态库与动态库
    [Linux高并发服务器]制作静态库与动态库[Linux高并发服务器]制作静态库与动态库​​[Linux高并发服务器]制作静态库与动态库​​​​什么是库​​​​静态库的制作和使用......
  • linux ftp 操作命令
    1. Linux 终端连接FTP[oracle@Dave~]$ ftp10.85.7.97Connectedto10.85.7.97.220Serv-UFTPServerv6.4forWinSockready...500'AUTH':commandnotunderstood.......
  • Linux 查看磁盘空间
    linux查看磁盘空间可以使用df和du命令。dfdf以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。例如,我们使用df-h命令来查看......
  • 简述五种开源NAS存储服务器--转
    存储对于公司来说是必不可少的:数据必须被存储、检索、共享和保护。下面小编为大家介绍一下5款开源的NAS存储服务器一、云计算云计算正在蓬勃发展,比任何云存储系统都要快......
  • linux rabbitmq 安装方法
    1.安装erlang运行以下命令,安装erlang所需要的依赖包。yuminstall-ymakegccgcc-c++m4opensslopenssl-develncurses-develunixODBCunixODBC-develjavajav......
  • [ Linux ] 进程间通信之共享内存
    在上篇博文我们了解了通过管道完成进程间通信,我们了解匿名管道和命名管道,并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先......
  • Linux 命令 su 和 sudo 的区别
    之前一直对su和sudo这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下。1.准备工作因为本篇博客中涉及到用户切换,......
  • 寻找Linux单机负载瓶颈
    服务器性能上不去,是哪里出了问题?IO还是CPU?只有找到瓶颈点,才能对症下药; 如何寻找Linux单机负载瓶颈,遵循的原则是不要推测,我们要通过测量的数据说话;负载分两类: 1.CPU负载; ......
  • 8.8.8.8,Google推出免费DNS解析服务器
    Google今天又给了我们一个惊喜,并沉重的打击了OpenDNS:他们刚刚宣布向所有的互联网用户提供一组快速,安全并且完全免费的DNS解析服务器,地址分别是:8.8.8.88.8.4.4我想这组ip看......
  • __attribute__修饰使用在linux编程中的使用
    int__attribute__((weak))func();当我们用__attribute__((weak))修饰func()函数后,func就是一个弱符号。不管外部是否定义了func()我们都可以链接通过,当外部定义了就调用外......