makefile中的两个函数(wildcard和patsubst)

(1) wildcard函数

作用是查找指定目录下指定类型的文件,并最终返回一个环境变量,需要用$取值赋值给另一个环境变量!该函数只有一个参数,如取出当前目录下的所有.c文件,并赋值给allc普通变量:  allc=$(wildcard ./*.c)。

(2) patsubst函数

作用是更换文件的后缀格式,共有三个参数。如将allc的所有.c的文件更换为.o的文件: allo=$(patsubst %.c,%.o,$(allc))。 

注意以上两个函数的返回值都为变量值,都必须用$取值。makefile中的所有函数都必须要有返回值。

allo1=$(patsubst %.c,./bin/%.o,$(allc))  将替换后生成的.o文件都存放在./bin/中,指出路径。

(3)不带依赖条件的规则

对于没有依赖条件,只有目标和命令的规则,说明为了实现该目标,不需要任何依赖条件,直接执行命令即可。makefile直接执行命令。下面举例说明:  再次强调一点,每一行的命令前必须有一个tab缩进,这是makefile识别命令的判断符号。

clean:

        -mkdir /aa   //-表示,该条命令执行失败了,也会继续向下执行下一条命令

        rm -f $(allo) $(target)

 

hello:          //举例说明,这一项在以后中不要

        echo "hello, makefile"

[root@localhost src]# make clean   //只是执行clea后面的命令即可

[root@localhost src]# make hello   //只是执行hello后面的命令即可

如果在makefile文件目录中有一个以clean或hello名字为名的文件(即相同了),则make clean和make hello不会执行命令,需要进行伪目标声明,即:

.PHONY:clean        //伪目标的声明

clean:

        -mkdir /aa   //-表示,该条命令执行失败了,也会继续向下执行下一条命令

        rm -f $(allo) $(target)

 

.PHONY:hello        //伪目标的声明

hello:          //举例说明,这一项在以后中不要

        echo "hello, makefile"

最后,如果makefile文件不是以makefile或Makefile为名字,需要加上-f参数:make -f filename

下面给出之前例子makefile书写的最终版,即把一个规则,两个变量和三个函数结合:

[root@localhost src]# ls
a  add.c  div.c  main.c  makefile  mul.c  sub.c
[root@localhost src]# vim zsxmakefile

allc=$(wildcard ./*.c)    //获取所有的.c文件
obj=$(patsubst %.c,%.o,$(allc))   //更换为.o文件,取得目标文件
target=zsx

$(target):$(obj)
        $(CC) -ggdb3 $^ -o $@

main.o:main.c
        $(CC) -pedantic -Wall -pipe -c $^ -o $@ -I ../include

%.o:%.c
        $(CC) -pedantic -Wall -pipe -c $< -o $@
        
.PHONY:clean1  //伪目标的声明

clean1:
        -mkdir b    //-代表该条命令执行失败了,也会继续向下执行下一条命令
        rm -f $(obj) $(target)

.PHONY:hello     //伪目标的声明

hello:
        echo "hello, makefile"


[root@localhost src]# rm -f makefile 
[root@localhost src]# ls
a  add.c  div.c  main.c  mul.c  sub.c  zsxmakefile
[root@localhost src]# make -f zsxmakefile   //此时需要加-f参数
cc -pedantic -Wall -pipe -c mul.c -o mul.o
cc -pedantic -Wall -pipe -c main.c -o main.o -I ../include
cc -pedantic -Wall -pipe -c add.c -o add.o
cc -pedantic -Wall -pipe -c div.c -o div.o
cc -pedantic -Wall -pipe -c sub.c -o sub.o
cc -ggdb3 mul.o main.o add.o div.o sub.o -o zsx
[root@localhost src]# ls
a  add.c  add.o  div.c  div.o  main.c  main.o  mul.c  mul.o  sub.c  sub.o  zsx  zsxmakefile
[root@localhost src]# make -f zsxmakefile clean1    //注意使用方法  如果文件名字是makefile或Makefile,则直接为make clean1
mkdir b
rm -f ./mul.o ./main.o ./add.o ./div.o ./sub.o zsx
[root@localhost src]# ls
a  add.c  b  div.c  main.c  mul.c  sub.c  zsxmakefile
[root@localhost src]# make -f zsxmakefile hello //注意使用方法
echo "hello, makefile"
hello, makefile

 

//注意区分makemake cleanmake hello的作用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

231. 2的幂

给定一个整数&#xff0c;编写一个函数来判断它是否是 2 的幂次方。 示例 1: 输入: 1 输出: true 解释: 20 1 示例 2: 输入: 16 输出: true 解释: 24 16 示例 3: 输入: 218 输出: false 解法一&#xff1a; class Solution { public:bool isPowerOfTwo(int n) {return(n >…

C库函数

Linux的系统I/O函数&#xff08;read、write、open、close和 lseek等&#xff09;与C语言的C库函数&#xff08;libc.so库文件中&#xff09;都是相对应的&#xff0c;它们都是动态库函数。如下图所示&#xff0c;C库函数有fopen、fclose、fwrite、fread和fseek等。这些C库函数…

【Leetcode | 48】226. 翻转二叉树

翻转一棵二叉树。 示例&#xff1a; 输入&#xff1a; 4 / \ 2 7 / \ / \ 1 3 6 9 输出&#xff1a; 4 / \ 7 2 / \ / \ 9 6 3 1 备注: 这个问题是受到 Max Howell 的 原问题 启发的 &#xff1a; 谷歌&#xff1a;我们90&#xff05;的…

C库函数与Linux系统函数之间的关系

由上小节知道&#xff0c;C库函数是借助FILE类型的结构体来对文件进行操作的&#xff0c;其本身只是在用户空间&#xff08;I/O缓冲区&#xff09;进行读写操作&#xff0c;而数据在内核与用户空间之间的传递、以及将内核与I/O设备之间的数据传递都是该C库函数进行一系列的系统…

【第十六章】模板实参推断

二、模板显式推断 在C中&#xff0c;若函数模板返回类型需要用户指定&#xff0c;那么在定义函数模板时&#xff0c;模板参数的顺序是很重要的&#xff0c;如下代码&#xff1a; template <typename T1, typename T2, typename T3> //模板一 T1 sum(T2 a, T3 b) {retu…

open函数和errno全局变量

&#xff08;1&#xff09;open函数 man man 查看man文档的首页 其中DESCRIPTION部分描述了man文档的每一章的章节内容 第2章System calls为系统调用&#xff0c;即Liunx系统函数。 man 2 open 查看第二章的open函数的详细帮助文件。 open函数用于打开一个已经的文件或者创…

open函数和close函数的使用

学习几个常用的Linux系统I/O函数&#xff1a;open、close、write、read和lseek。注意&#xff0c;系统调用函数必须都考虑返回值。 &#xff08;1&#xff09;open函数的使用 首先&#xff0c;需要包含三个头文件&#xff1a;<sys/types.h> <sys/stat.h> <…

【Leetcode | 9】217. 存在重复元素

解题代码&#xff1a; bool containsDuplicate(vector<int>& nums) {return nums.size() > set<int>(nums.begin(), nums.end()).size(); }

全缓冲、行缓冲和无缓冲

这里的缓冲是指的是用户空间的I/O缓冲区&#xff0c;不是内核缓冲。 无缓冲&#xff1a;用户层不提供缓冲&#xff0c;数据流直接到内核缓冲&#xff0c;再到磁盘等外设上。标准错误输出&#xff08;2&#xff09;通常是无缓存的&#xff0c;因为它必须尽快输出&#xff0c;且…

【Leetcode】1. 两数之和

给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7, 11, 15], targ…

read和write函数的使用

都需要包含头文件&#xff1a; <unistd.h> read系统函数从打开的设备或文件中读取数据&#xff0c;即将数据从外设上经过内核读到用户空间&#xff1b;write系统函数相反&#xff0c;向打开的设备或文件中写入数据&#xff0c;即将数据从用户空间&#xff08;I/O缓冲&am…

1091. Acute Stroke (30)

One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions are identified in each MRI slice, your job is to calculate the volume of the stroke core. Input Speci…

lseek函数的使用

需要包含头文件&#xff1a;<sys/types.h> <unistd.h> off_t lseek(int fd, off_t offset, int whence)&#xff1b; 函数原型 函数功能&#xff1a;移动文件读写指针&#xff1b;获取文件长度&#xff1b;拓展文件空间。 在使用该函数之前需要将文件打开&…

19. 删除链表的倒数第N个节点

给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头结点。 示例&#xff1a; 给定一个链表: 1->2->3->4->5, 和 n 2. 当删除了倒数第二个节点后&#xff0c;链表变为 1->2->3->5. 说明&#xff1a; 给定的 n 保证是有效的。…

文件操作相关的系统函数

重点学习&#xff1a;stat&#xff08;fstat、lstat 获取文件属性&#xff09;、access&#xff08;测试指定文件是否拥有某种权限&#xff09;、chmod&#xff08;改变文件的权限&#xff09;、chown&#xff08;改变文件的所属主和所属组&#xff09;、truncate&#xff08;截…

stat函数(stat、fstat、lstat)

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> //需包含头文件 有如下三个函数的函数原型&#xff1a; int stat(const char *path, struct stat *buf); 第一个形参&#xff1a;指出文件&#xff08;文件路径&#xff09;&…

1062. Talent and Virtue (25)

About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about peoples talent and virtue. According to his theory, a man being outstanding in both talent and virtue must be a "sage&#xff08;圣人&#xff09;"…

access、strtol函数的使用(后者为C库函数)

#include <unistd.h> int access(const char *pathname, int mode); 作用&#xff1a;检查调用该函数的进程是否可以对指定的文件执行某种操作。 第一个形参&#xff1a;文件名&#xff1b;第二个形参&#xff1a;R_OK&#xff08;是否可读&#xff09;、W_OK&#xf…

chmod、chown函数的使用

#include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 作用&#xff1a;改变指定文件的权限。第二个参数&#xff1a;mode必须为一个8进制数&#xff1b;返回值为0表示成功&#xff0c;-1表示失败。 //代码 #include…

606. 根据二叉树创建字符串

你需要采用前序遍历的方式&#xff0c;将一个二叉树转换成一个由括号和整数组成的字符串。 空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。 示例 1: 输入: 二叉树: [1,2,3,4] 1 / \ …