0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Makefile文件的編寫規(guī)則及實例

CHANBAEK ? 來源:小浩筆記 ? 作者:一紙HH ? 2023-05-19 14:52 ? 次閱讀

Makefile帶來直接好處就是——“自動化編譯”。一旦寫好,只需要一個make命令,整個工程完全自動編譯,所以十分方便。而Makefile文件就是告訴make命令怎么樣地去編譯和鏈接程序。但是想要比較靈活的運用它,還是先要熟悉一些關(guān)于系統(tǒng)對程序編譯和鏈接的知識。

1.一個簡單的makefile例子

假設(shè)一個程序有兩個文件file1.c,file2.c,每個文件都包含head.h,生成file可執(zhí)行文件

file:file1.o file2.o       附屬行(文件的依存關(guān)系)
    gcc -o file1.o file2.o    命令行
file1.o:file1.c head.h
    gcc -c file1.c
file2.o:file2.c head.h
    gcc -c file2.c

從file最終的目標文件開始倒推,依次列出文件的依存關(guān)系,make在執(zhí)行時:

(1)判斷file可執(zhí)行文件是否存在,若不存在,則執(zhí)行命令行,向下尋找依存關(guān)系

(2)若file存在,則檢查依靠文件,是否存在更新,若存在更新則執(zhí)行命令行,若沒有更新則給出提示:

make:'file' is up to date.

2.makefile中的宏定義及內(nèi)部變量

宏定義:

OBJS = file1.o file2.o
CC = gcc
CFLAGS = -wall -O -g

引用:

file:$(OBJS)
    $(CC) $(OBJS) -o file
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c file1.c
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c file2.c

內(nèi)部變量:

$^ 代表所有的依賴文件

$@ 代表所有的目標文件

$< 代表第一個依賴文件

file:$(OBJS)
    $(CC) $^ -o $@
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c $< -o $@
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c $< -o $@

"(CC) **(FLAGS) -c **< -o @"是隱含規(guī)則,可以不寫,默認使用此規(guī)則ww

3.假象

假設(shè)一個項目要生成兩個可執(zhí)行文件file1和file2,這兩個文件是獨立的,則在makefile開始處:

all:file1 file2

make總是假設(shè)all要生成,去檢查它的依賴文件

4.清除由make產(chǎn)生的文件

clean:
    rm *.o
    rm file

執(zhí)行:

make clean

則會清除由make生成的*.o和file文件

如果有clean文件存在,則清除不會執(zhí)行(因clean沒有可依賴的文件,永遠是最新的)

使用PHONY目標,避免同名文件相沖突,不會檢查clean文件存在與否,都要執(zhí)行清除操作

.PHONY : clean
clean:
    rm *.o   
     rm file

5.makefile函數(shù)

搜索當(dāng)前目錄,生成由*.c結(jié)尾的文件列表,wildcard--函數(shù)名

SOURCE = $(wildcard *.c)

用%.o替換$(SOURCE)中的%.c文件

OBJS = $(patsubst %.c,%.o,$(SOURCE))

6.產(chǎn)生新規(guī)則

SOURCE = $(wildcard *.c)
depends:$(SOURCE)
    gcc -M $(SOURCE) > depends

(為每一個.c文件產(chǎn)生規(guī)則,c文件和相關(guān)頭文件為依靠)

在makefile文件中:

include depends

7.一個有效的makefile文件

可以完成大部分我們所需要的依靠檢查,不用做太多的修改就可用在大多數(shù)項目里

功能:搜索當(dāng)前目錄,尋找源碼文件,放入SOURCE變量里,利用patsubst產(chǎn)生目標文件(*.o)

CC = gcc
CFLAGS = -Wall -O -g
 
SOURCE = $(wildcard *.c,*.cc)
OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))
 
file:$(OBJS)
    $(CC) $^ -o $@

用默認規(guī)則產(chǎn)生目標文件(*.o)

(缺點:并未包含頭文件,當(dāng)頭文件更新時,不能重新編譯)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    555

    瀏覽量

    24639
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3747

    瀏覽量

    80669
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    669

    瀏覽量

    21956
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    647

    瀏覽量

    32743
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19153
收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于Makefile自動生成-autotools的使用

    在Linux應(yīng)用開發(fā)中,編寫Makefile是一項必備技能,因為它定義了工程中所有文件的編譯順序、規(guī)則和依賴關(guān)系,決定了哪些文件需要編譯以及
    的頭像 發(fā)表于 07-25 15:50 ?1411次閱讀
    關(guān)于<b class='flag-5'>Makefile</b>自動生成-autotools的使用

    Makefile的引入及規(guī)則。

    裸板程序的時候,使用Makefile組織管理這些程序,本節(jié)講解Makefile最基本的規(guī)則。 Makefile要做什么事情呢? 組織管理程序和文件
    發(fā)表于 04-11 17:37

    Makefile函數(shù)和實例分析

    首發(fā)平臺:微信公眾號baiwenkejiARM裸機1期加強版視頻課程配套WiKi第9課第7節(jié)Makefile函數(shù)和第8節(jié)Makefile實例。發(fā)現(xiàn)沒有?wiki.100ask.org 也有變化:多了
    發(fā)表于 04-25 11:03

    Makefile編寫

    的起始字符必須為TAB字符。如果DEPENDENCIES中有一個或多個文件更新的話,COMMAND就要執(zhí)行,這就是Makefile最核心的內(nèi)容。接下來就根據(jù)這個Makefile基本規(guī)則
    發(fā)表于 11-02 15:59

    什么是腳本? makefile編寫規(guī)則有哪些

    一、實驗?zāi)康暮鸵?了解什么是腳本2掌握shell編程方法3掌握makefile編寫規(guī)則二、實驗內(nèi)容和原理1編寫一個Shell腳本,要求:顯示當(dāng)前目錄的所有內(nèi)容,并統(tǒng)計可執(zhí)行
    發(fā)表于 12-22 07:52

    如何編寫makefile文件?

    如何編寫makefile文件
    發(fā)表于 12-24 07:36

    怎樣去編寫makefile體系的規(guī)則

    為什么要學(xué)習(xí)makefile?makefile體系的工作原理是什么?怎樣去編寫makefile體系的規(guī)則呢?
    發(fā)表于 12-27 06:36

    makefile文件編寫方式

    文章圍繞makefile文件編寫方式,向讀者講述如何在ubuntu平臺上用交叉編譯鏈 arm-none-eabi- 編譯出 STM32F4xx 系列 MCU 的執(zhí)行文件。文章核心在于
    發(fā)表于 02-07 06:47

    Linux內(nèi)核Makefile文件

    Makefile文件的詳細編寫過程
    發(fā)表于 08-28 09:25 ?14次下載

    如何寫Makefile編譯匯編和C文件

    經(jīng)常在一個項目中包含多個.c源文件,而且一個.c源文件包含了一堆的頭文件,這種情況下如何編寫makefile,使得能成功編譯整個項目?本博文
    發(fā)表于 11-24 09:03 ?1.4w次閱讀
    如何寫<b class='flag-5'>Makefile</b>編譯匯編和C<b class='flag-5'>文件</b>

    Makefile編寫實例程序和詳細資料免費下載

    本文檔的作用內(nèi)容詳細介紹的是Makefile編寫實例程序和詳細資料免費下載。
    發(fā)表于 09-12 11:55 ?6次下載
    <b class='flag-5'>Makefile</b><b class='flag-5'>編寫實例</b>程序和詳細資料免費下載

    Linux關(guān)于Makefile的用法介紹

    Make可以從一個名為Makefile文件中獲得如何構(gòu)建程序的知識,該文件列出了每個非源文件以及如何從其他文件計算它。當(dāng)你
    發(fā)表于 12-24 10:36 ?1862次閱讀

    makefile都有哪些語法?

    中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執(zhí)行。這就是Makefile規(guī)則。也就是Makefile
    的頭像 發(fā)表于 05-06 16:07 ?1399次閱讀

    Makefile是如何編譯代碼文件的?

    makefile文件最常用的作用是,告訴make程序,如何來編譯以及連接程序,最終生成可執(zhí)行的二進制文件。
    的頭像 發(fā)表于 05-18 15:27 ?4024次閱讀
    <b class='flag-5'>Makefile</b>是如何編譯代碼<b class='flag-5'>文件</b>的?

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根據(jù)指定的依賴規(guī)則文件是否有修改來執(zhí)行命令。常用來編譯軟件源代碼,只需要重新編譯修改過的文件,使得編譯速度大大加快。
    的頭像 發(fā)表于 01-25 11:18 ?603次閱讀