<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [Linux工具] Makefile

      簡介

      Linux的make程序用來自動化編譯大型源碼,很多時候,我們在Linux下編譯安裝軟件,只需要敲一個make就可以全自動完成,非常方便。

      make能自動化完成這些工作,是因為項目提供了一個Makefile文件,它負責告訴make,應該如何編譯和鏈接程序。

      Makefile相當于Java項目的pom.xml,Node工程的package.json,Rust項目的Cargo.toml,不同之處在于,make雖然最初是針對C語言開發,但它實際上并不限定C語言,而是可以應用到任意項目,甚至不是編程語言。此外,make主要用于Unix/Linux環境的自動化開發,掌握Makefile的寫法,可以更好地在Linux環境下做開發,也可以為后續開發Linux內核做好準備。

      在本教程中,我們將由淺入深,一步一步學習如何編寫Makefile,完全針對零基礎小白,只需要提前掌握如何使用Linux命令。

      安裝make

      在Linux(Ubuntu)系統中,我們可以使用包管理工具直接安裝make以及GCC工具鏈。例如在Ubuntu下,使用以下命令:

      $ sudo apt update
      $ sudo apt install build-essential
      

      安裝完成后,可以輸入以下命令驗證安裝是否成功:

      $ make -v
      GNU Make 4.3
      
      $ gcc --version
      gcc (Ubuntu ...) 11.4.0
      

      這樣,我們就成功地安裝了make,以及GCC工具鏈。

      Makefile基礎

      在Linux環境下,當我們輸入make命令時,它就在當前目錄查找一個名為Makefile的文件,然后,根據這個文件定義的規則,自動化地執行任意命令,包括編譯命令。

      Makefile由若干條規則(Rule)構成,每一條規則指出一個目標文件(Target),若干依賴文件(Prerequisites),以及生成目標文件的命令。規則的基本格式如下:

      目標文件: 依賴文件1 依賴文件2 ...
          命令
      

      緊接著,以Tab開頭的是命令,用來生成目標文件。命令可以是任何Shell命令,如gcccpmv等。以#開頭的是注釋,會被make命令忽略。

      編譯C語言程序

      下面是一個典型的Makefile,用于編譯C語言程序:

      BIN=code          # 目標文件
      CC=gcc            # 編譯器
      SRC=$(wildcard *.c) # 所有的.c文件
      OBJ=$(SRC:.c=.o)  # 替換為.o文件
      LFLAGS=-o
      FLAGS=-c
      RM=rm -f          # 刪除方式
      
      $(BIN): $(OBJ)
          @$(CC) $(LFLAGS) $@ $^
      
      %.o: %.c
          @$(CC) $(FLAGS) $<
      
      .PHONY: clean
      clean:
          $(RM) $(OBJ) $(BIN)
      

      在這個Makefile中:

      • BIN=code:變量 BIN 的值是 code,表示目標文件名。
      • CC=gcc:變量 CC 的值是 gcc,表示所使用的編譯器。
      • SRC=$(wildcard *.c)SRC 表示當前目錄下所有的 .c 文件,使用 wildcard 函數動態生成。
      • OBJ=$(SRC:.c=.o):將 SRC 中的 .c 文件名替換為 .o,表示目標文件對應的中間文件(對象文件)。
      • LFLAGS=-o:鏈接選項,指定輸出文件名。
      • FLAGS=-c:編譯選項,用于生成中間文件。
      • RM=rm -f:刪除命令,用于清理目標文件和中間文件。
      • $(wildcard *.c) 用于匹配當前目錄下的所有.c文件。
      • $(SRC:.c=.o) 將所有的.c文件替換為.o文件。
      • $@ 表示目標文件。
      • $< 表示第一個依賴文件。
      • $^ 表示所有依賴文件。
      • .PHONY 聲明clean為偽目標,避免與同名文件沖突。

      執行make即可編譯,執行make clean可清理生成的文件。

      **注意:**如果在修改文件內容,但是其他文件沒有改變內容(Modify time)沒有更新,則未改變的文件不會進行重新編譯,可能會造成程序出現問題。所以當項目出現問題的時候可以對項目進行重新創建,以此解決問題。

      使用隱式規則

      Makefile支持許多內置的隱式規則,例如編譯C語言程序的規則:

      %.o: %.c
          $(CC) $(FLAGS) $<
      

      含義:

      • 將每個 .c 文件編譯為對應的 .o 文件(對象文件)。
      • $< 表示第一個依賴文件。

      所以該規則會使*.c從第一個開始,逐個編譯為對應的.o文件。

      小結:隱式規則讓Makefile更簡潔,很多情況下不需要顯式定義規則。

      使用變量

      賦值形式 =

      這種賦值在解析時是延遲展開的。也就是說,右側的值在被使用時才會被計算,左值變為變量來使用。這種賦值方式是 GNU Make 的標準形式。

      例如:

      SRC=$(wildcard *.c)
      

      變量可以提高Makefile的可讀性和可維護性。例如:

      CC=gcc
      CFLAGS=-Wall -g
      SRC=main.c utils.c
      OBJ=$(SRC:.c=.o)
      
      program: $(OBJ)
          $(CC) $(CFLAGS) -o $@ $^
      
      %.o: %.c
          $(CC) $(CFLAGS) -c $< -o $@
      
      .PHONY: clean
      clean:
          rm -f $(OBJ) program
      

      符號說明:

      • $(變量名):表示引用變量,例如$(CC)引用了變量CC,其值為gcc

      示例:

      1. $@ 示例
      objects = foo.o bar.o
      
      $(objects): %.o: %.c
          gcc -c $< -o $@
      

      在這個例子中,$@ 將被替換為每個 .o 文件的目標名稱,如 foo.obar.o

      • $@ 代表當前規則的目標文件名(即左側的文件)。
      • 它用于在命令中引用規則左側的目標。
      1. $^ 示例
      target: dependency1 dependency2
          gcc -o $@ $^
      

      在這個例子中,$^ 將被替換為 dependency1 dependency2

      • $^ 代表當前規則中所有依賴文件的列表。
      • 它用于在命令中引用規則右側的所有依賴文件。
      1. $< 示例
      %.o: %.c
          gcc -c $< -o $@
      

      在這個例子中,$< 將被替換為規則中的第一個依賴文件,如 main.c

      • $< 專門用來引用規則中列出的第一個依賴文件。

      通過這些示例,可以清楚地理解這些符號的用途及功能。

      使用模式規則

      模式規則支持使用通配符定義一組目標文件的規則,例如:

      %.o: %.c
          $(CC) -c $< -o $@
      

      符號說明:

      • %:通配符,表示任意文件名。例如,%.o匹配所有.o文件,%.c匹配所有.c文件。
      • $<:表示當前規則中的第一個依賴文件。例如,main.c
      • $@:表示目標文件。例如,main.o

      通過模式規則,可以避免重復定義規則,適用于大規模項目中的批量操作。

      自動生成依賴

      對于大型項目,手動維護依賴關系容易出錯。我們可以使用gcc-M選項自動生成依賴關系:

      gcc -MM main.c > deps.d
      

      然后在Makefile中包含生成的依賴文件:

      include deps.d
      

      自動生成依賴的意義:

      • 動態更新依賴關系:當源碼文件發生變動時,重新運行依賴生成命令即可更新deps.d
      • 減少人工維護的錯誤:避免手動書寫依賴關系帶來的遺漏問題。

      注意:

      • 包含依賴文件時,如果依賴文件不存在,Makefile可能會報錯。為此,可以使用如下方式:
      -include deps.d
      

      這表示如果deps.d不存在,Makefile將不會報錯。

      示例:

      1. 自動生成依賴文件
      %.d: %.c
          @set -e; rm -f $@; \
          $(CC) -MM $(CFLAGS) $< > $@.$$$$; \
          mv $@.$$$$ $@
      

      在這個規則中,依賴文件 .d 將自動根據對應的 .c 文件生成。

      1. 包含所有依賴
      include $(SRC:.c=.d)
      

      通過這條規則,可以動態包含所有的依賴文件。

      完善Makefile

      通過上述方法,我們可以逐步完善一個Makefile。以下是一個完整的示例:

      BIN=program
      CC=gcc
      CFLAGS=-Wall -g
      SRC=$(wildcard *.c)
      OBJ=$(SRC:.c=.o)
      
      $(BIN): $(OBJ)
          $(CC) $(CFLAGS) -o $@ $^
      
      %.o: %.c
          $(CC) $(CFLAGS) -c $< -o $@
      
      .PHONY: clean
      clean:
          rm -f $(OBJ) $(BIN)
      
      .PHONY: all
      all: clean $(BIN)
      
      -include deps.d
      
      %.d: %.c
          @set -e; rm -f $@; \
          $(CC) -MM $(CFLAGS) $< > $@.$$$$; \
          mv $@.$$$$ $@
      

      通過以上內容的學習,已經足夠編寫寄出的Makefile~

      posted @ 2025-01-02 14:58  DevKevin  閱讀(65)  評論(0)    收藏  舉報  來源
      主站蜘蛛池模板: 亚洲色大成网站www永久男同| 内射老阿姨1区2区3区4区| 色丁香一区二区黑人巨大| 日韩精品一区二区在线视| 亚洲 欧洲 无码 在线观看| 亚洲日韩乱码一区二区三区四区| 国产一区二区三区导航| 国产人妻人伦精品婷婷| 日本一区二区不卡精品| 中文字幕无码色综合网| 高清性欧美暴力猛交| 天堂va蜜桃一区二区三区| 精品免费看国产一区二区| 免费观看添你到高潮视频| 五月天国产成人av免费观看| 国产成人永久免费av在线| 国产成人精品白浆免费视频试看| 亚洲五月天综合| 亚洲精品99久久久久久欧美版| 国产熟女一区二区三区四区| 91精品国产吴梦梦在线观看永久| 中文字幕国产日韩精品| 非会员区试看120秒6次| 免费成人网一区二区天堂| 精品亚洲欧美中文字幕在线看| 中文乱码人妻系列一区二区| 亚洲丰满熟女一区二区蜜桃| 日韩精品一区二区三区日韩| 亚洲中文日韩一区二区三区| 男女性高爱潮免费网站| 年轻女教师hd中字3| 少妇xxxxx性开放| 大地资源网第二页免费观看| 日本一区二区三区在线 |观看| 久久精品国产亚洲av久| 日本熟妇hdsex视频| 成人网站网址导航| 日本精品极品视频在线| 精品视频在线观看免费观看| 日韩一区二区三区无码影院| 国内熟妇人妻色在线视频|