日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个通用Makefile详解

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个通用Makefile详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們在Linux環(huán)境下開發(fā)程序,少不了要自己編寫Makefile,一個(gè)稍微大一些的工程下面都會包含很多.c的源文 件。
如果我們用gcc去一個(gè)一個(gè)編譯每一個(gè)源文件的話,效率會低很多,但是如果我們可以寫一個(gè)Makefile,那么只需要執(zhí)行一個(gè)make就OK了,這 樣大大提高了開發(fā)效率。

但是Makefile的語法規(guī)則眾多,而且缺乏參考資料,對于初學(xué)者來說,寫起來還是有一定的難度,往往令很多人望而生畏。
下面我 們介紹一個(gè)比較通用而且簡潔的Makefile,大家只要對它稍作修改就可以用在你們自己的工程里了。

現(xiàn)在假設(shè)我們有一個(gè)工程叫my_project,工程源碼目錄下面有app1.c,app2.c,app3.c以及main.c這五個(gè)源文件。我們現(xiàn)在需要編譯出app1.o,app2.o,app3.o以及main.o,然后再把這些.o文件鏈接成為一個(gè)ELF格式的可執(zhí)行程序叫做my_app。我們先看一個(gè)最簡單的Makefile如何編寫:

my_app : main.o, app1.o, app2.o, app3.o, app4.o
gcc –o my_app main.o app1.o, app2.o, app3.o, app4.o

main.o : main.c
gcc –c main.c
app1.o : app1.c
gcc –c app1.c
app2.o : app2.c
gcc –c app2.c
app3.o : app3.c
gcc –c app3.c

clean :
rm main.o app1.o, app2.o, app3.o, app4.o

這是一個(gè)傻瓜式的Makefile,不靈活,而且不具備可復(fù)制性,想象一個(gè)如果我們的工程下面有50個(gè)源文件,那豈不是要一個(gè)一個(gè)寫出來。

我們的目標(biāo)是寫一個(gè)Makefile,只要稍作修改就可以在各個(gè)工程之間通用。

下面這個(gè)Makefile就可以滿足這個(gè)要求:

  • SRCS = $(wildcard *.c)
  • OBJS = $(SRCS:.c = .o)
  • CC = gcc
  • INCLUDES = -I/×××
  • LIBS = -L/×××
  • CCFLAGS = -g -Wall -O0

  • my_app : $(OBJS)
  • $(CC) $^ -o $@ $(INCLUDES) $(LIBS)

  • %.o : %.c
  • $(CC) -c $< $(CCFLAGS)
  • clean:
  • rm *.o
  • .PHONY:clean

  • 大家看這個(gè)Makefile和前一個(gè)比起來是不是簡潔很多,當(dāng)然理解起來不如上一個(gè)那么直觀。
    實(shí)際上編寫 Makefile就是為了提高我們的工作效率,而不是增加我們的工作量。

    因此Makefile為我們提供了很多強(qiáng)大的功能,比如定義變量,使用通配符等 等。只要合理利用,就可以達(dá)到事半功倍的效果。
    下面我們一條一條分析這個(gè)Makefile:

    SRCS = $(wildcard *.c)
    這條語句定義了一個(gè)變量SRCS,它的值就是當(dāng)前面目錄下面所有的以.c結(jié)尾的源文件。

    OBJS = $(SRCS:.c = .o)
    這里變量OBJS的值就是將SRCS里面所有.c文件編譯出的.o目標(biāo)文件

    CC = gcc
    變量CC代表我們要使用的編譯器

    INCLUDES = -I/×××
    LIBS = -L/×××
    這里指定除了編譯器默認(rèn)的頭文件和庫文件的路徑之外需要額外引用的頭文件路徑以及庫的路徑(×××表示路徑)。

    CCFLAGS = -g -Wall -O0
    CCFLAGS變量存放的是編譯選項(xiàng)

    my_app : $(OBJS)
    $(CC) $^ -o $@ $(INCLUDES) $(LIBS)
    my_app依賴于所有的.o文件,$^代表$(OBJS),$@代表my_app

    %.o : %.c
    $(CC) -c $< $(CCFLAGS)
    將所有的.c源代碼編譯成.o目標(biāo)文件,這樣寫是不是很省事?
    clean:
    rm *.o
    在執(zhí)行make clean之后刪除所有編譯過程中生成的.o文件。

    .PHONY:clean
    每次執(zhí)行make clean時(shí)都要執(zhí)行rm *.o命令

    這個(gè)Makefile就具備靈活的通用性,我們只要對它稍作修改就可以用在自己的工程里面。當(dāng)然Makefile還有很多強(qiáng)大的功能,需要我們進(jìn)一步學(xué)習(xí)。

    談程序員的出路

    為IT程序員量身定制的12個(gè)目標(biāo)——很經(jīng)典

    我的25年嵌入式生涯--周立功 (很值得一讀)

    技術(shù)七年之感受

    成為Java高手的25個(gè)學(xué)習(xí)目標(biāo)--經(jīng)典

    程序員每年要做的十件事

    一年輕女董事長對同齡人的忠告:不想窮的要看看

    如何讓IT人遠(yuǎn)離慢性疲勞

    長期操作電腦需要養(yǎng)成的好習(xí)慣

    IT程序員,為什么會無奈苦逼

    Java 的工作原理

    IT人程序員著裝穿衣7大盲區(qū),教你穿得更帥氣更精神更個(gè)性!

    Java語言的輝煌,還能延續(xù)多久?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/javaTest/archive/2012/05/11/2589265.html

    總結(jié)

    以上是生活随笔為你收集整理的一个通用Makefile详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。