makefile文件的書寫規則(make和makefile)

對于makefile,掌握一個規則,兩個變量和三個函數。下面介紹一個規則。

makefile的作用:一個項目代碼的管理工具。當一個項目的代碼文件數(如.c文件)太多,用gcc編譯會太麻煩,如果全部文件一次性編譯,一個文件有錯誤,所有文件都需要重新編譯。如果每個文件單獨編譯,則十分麻煩。因此,就有項目代碼管理工具makefile。項目代碼編譯管理;節省編譯項目的時間;一次編寫,終身受益。

[root@localhost src]# ls
add.c ?div.c ?libM1.so ?main.c ?mul.c ?sub.c
[root@localhost src]# gcc -pedantic -Wall -pipe -ggdb3 *.c -o zsx -I ../include/
[root@localhost src]# ls
add.c ?div.c ?libM1.so ?main.c ?mul.c ?sub.c ?zsx? //可以看出最終只是生成了zsx目標文件,因此有一個.c文件改變了,就會全部重新編譯,然后鏈接。
[root@localhost src]# ./zsx?
sum = 26
?

規則如下:

規則中的三要素:目標,依賴,命令

目標:依賴條件

?????? 命令? //tab縮進,必須要縮進

[root@localhost src]# ls
add.c ?div.c ?libM1.so ?main.c ?mul.c ?sub.c
[root@localhost src]# vim makefile
zsx:main.c sub.c add.c mul.c div.c
? ? ? ? gcc -pipe -pedantic -Wall -ggdb3 main.c sub.c add.c mul.c div.c -o zsx -I ../include //第二行必須有一個tab縮進

[root@localhost src]# make
gcc -pipe -pedantic -Wall -ggdb3 main.c sub.c add.c mul.c div.c -o zsx -I ../include
[root@localhost src]# ls
add.c ?div.c ?libM1.so ?main.c ?makefile ?mul.c ?sub.c ?zsx
[root@localhost src]# ./zsx
sum = 26
//上述中,生成的最終文件zsx自動會跟makefile文件在同一個目錄。注意兩點:1.對于依賴條件中的幾個文件如果不跟makefile在同一個目錄的話,必須指定其所在目錄(如../main.c、/mnt/hgfs/shared/ggc/Calc/add.c等),這樣makefile才能找到依賴條件所需的文件在哪里;2.在命令中,要分析清楚該命令是否需要指出頭文件、庫文件(-I? -L? -static? -l)。

舉例:

[root@localhost src]# ls
add.c ?div.c ?libM1.so ?main.c ?makefile ?mul.c ?sub.c
[root@localhost src]# vim makefile
zsx:main.o add.o sub.o mul.o div.o
? ? ? ? gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx
main.o:main.c
? ? ? ? gcc -pedantic -Wall -pipe -c main.c -o main.o -I ../include
add.o:add.c
? ? ? ? gcc -pedantic -Wall -pipe -c add.c -o add.o
sub.o:sub.c
? ? ? ? gcc -pedantic -Wall -pipe -c sub.c -o sub.o?
mul.o:mul.c
? ? ? ? gcc -pedantic -Wall -pipe -c mul.c -o mul.o?
div.o:div.c
? ? ? ? gcc -pedantic -Wall -pipe -c div.c -o div.o

[root@localhost src]# make
gcc -pedantic -Wall -pipe -c main.c -o main.o -I ../include? //生成main.o
gcc -pedantic -Wall -pipe -c add.c -o add.o //生成add.o
gcc -pedantic -Wall -pipe -c sub.c -o sub.o //生成sub.o
gcc -pedantic -Wall -pipe -c mul.c -o mul.o //生成mul.o
gcc -pedantic -Wall -pipe -c div.c -o div.o //生成div.o
gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx? //生成最終目標? 且最后鏈接時加上調試信息 -ggdb3
[root@localhost src]# ./zsx
sum = 26
[root@localhost src]# ls
add.c ?add.o ?div.c ?div.o ?libM1.so ?main.c ?main.o ?makefile ?mul.c ?mul.o ?sub.c ?sub.o ?zsx? //可以看出,既生成了以及中間文件.o,還生成了最終目標文件zsx。因為幾個中間文件.o在makefile中也是目標文件,為次級目標文件。
[root@localhost src]# make
make: `zsx' is up to date.? //可以發現再次make沒有反應,這是因為make檢測到所有的文件都是最新的(即沒有改動過),因此不需要再次做重復的工作。
[root@localhost src]# rm -f zsx
[root@localhost src]# make
gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx? //此時make有了反應,因為make檢測到zsx目標文件刪除了,因此只需要執行最后一步鏈接操作即可。
[root@localhost src]# ./zsx
sum = 26

[root@localhost src]# vim add.c?? //修改了add.c的內容

[root@localhost src]# make

gcc -pedantic -Wall -pipe -c add.c -o add.o?? //只是重新編譯了add.c,編譯很費時間

gcc -ggdb3 main.o add.o sub.o mul.o div.o -o zsx? ? //更新最終目標, 鏈接不費時間

//最終目標一定要寫在第一行,如果未寫在第一行,則需要:all:zsx ?--> all指定生成的最終目標為zsx

總結:

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385421.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

100. 相同的樹

給定兩個二叉樹,編寫一個函數來檢驗它們是否相同。 如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。 示例 1: 輸入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 輸出: true…

makefile的兩個變量(自動變量和普通變量)

(1)普通變量 如: objmain.o add.o sub.o mul.o div.o //將后面的值賦值給obj,obj就是一個普通變量 targetzsx //將zsx賦值給target makefile中已經定義的一些普通變量(通常格式都是大寫,類似環境變量,它們都是普通…

【C++ Priemr | 15】虛函數表剖析(二)

一、多重繼承&#xff08;無虛函數覆蓋&#xff09; 下面&#xff0c;再讓我們來看看多重繼承中的情況&#xff0c;假設有下面這樣一個類的繼承關系。注意&#xff1a;子類并沒有覆蓋父類的函數。 測試代碼&#xff1a; class Base1 { public: virtual void f() { cout <…

1074. Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K 3, then you must output 3→2→1→6→5→4; if K 4, you must output 4→3→2→1→5→6. Input Spe…

【Leetcode | 47】 222. 完全二叉樹的節點個數

給出一個完全二叉樹&#xff0c;求出該樹的節點個數。 說明&#xff1a; 完全二叉樹的定義如下&#xff1a;在完全二叉樹中&#xff0c;除了最底層節點可能沒填滿外&#xff0c;其余每層節點數都達到最大值&#xff0c;并且最下面一層的節點都集中在該層最左邊的若干位置。若最…

makefile中的兩個函數(wildcard和patsubst)

(1) wildcard函數 作用是查找指定目錄下指定類型的文件&#xff0c;并最終返回一個環境變量&#xff0c;需要用$取值賦值給另一個環境變量&#xff01;該函數只有一個參數&#xff0c;如取出當前目錄下的所有.c文件&#xff0c;并賦值給allc普通變量&#xff1a; allc$(wildc…

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 保證是有效的。…