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.pswp.cn/news/385415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385415.shtml
英文地址,請注明出處:http://en.pswp.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 / \ …