一、make命令簡介
make命令是一種自動化編譯程序,他可以根據程序中的makefile文件來進行編譯、鏈接等操作。make命令可以很好地解決代碼規模較大、程序依賴較多時的編譯問題。在Linux環境下,make命令已經成為一種必備的編譯工具。
在使用make命令之前,需要先了解一下常用的編譯器。Linux系統上常用的編譯器有gcc、g++、ld等。gcc是一種C語言編譯器,g++是一種C++語言編譯器,ld則是用來進行鏈接操作的工具。
make命令利用makefile文件中的規則來進行編譯操作。makefile文件是一個腳本文件,用來指定編譯操作的依賴關係以及具體的編譯操作。一個makefile文件通常包含以下三個部分。
target:dependencies command
這裡的target指定了編譯目標,dependencies指定了這個目標所依賴的文件,command則是在這些文件滿足條件時所執行的編譯命令。這幾部分構成了makefile文件的規則。
二、make命令的使用方法
1、基本使用方法
下面是一個簡單的makefile文件例子,用來編譯一個名為hello的程序。
hello:hello.c gcc -o hello hello.c
在上面的例子中,我們指定了一個目標為hello的程序,依賴於hello.c文件,並且編譯命令是gcc -o hello hello.c。執行make命令時,make命令將會根據hello程序的規則來編譯程序。
使用make命令編譯hello程序,只需要在終端中進入hello的工作目錄,輸入make命令即可:
cd /path/to/hello/directory make
在完成編譯後,會在當前目錄下生成一個名為hello的可執行程序。
2、多目標編譯
當一個makefile文件需要對多個程序進行編譯時,我們可以使用多個目標來實現。
all:hello world hello:hello.c gcc -o hello hello.c world: world.c gcc -o world world.c
在這個例子中,我們指定了兩個目標:all、hello、world。其中all是默認目標,在執行make命令時,指定的目標如果為空,則默認使用all作為目標。
執行make命令時,會按照每個目標的編譯規則進行編譯操作。例如,編譯hello程序時,make命令會根據hello的規則來編譯hello程序。同樣的,編譯world程序時,make命令也會根據world的規則來編譯。
3、清除生成文件
當程序的編譯目標發生變化時,我們需要重新編譯程序。在重新編譯之前,我們需要先清理掉上一次編譯生成的文件。make命令提供了一個clean規則,用來清除生成的文件。
clean: rm -f hello world
在這個例子中,我們指定了一個名為clean的規則,用來清除生成的hello、world文件。使用make命令清除生成的文件,只需要在終端中進入程序所在的目錄,然後執行make clean命令即可:
cd /path/to/program/directory make clean
三、makefile編寫技巧
1、變量的使用
在makefile文件中,我們可以使用變量來表示程序需要的庫文件、編譯器等等。使用變量可以很大程度上提高編譯規則的可讀性和可維護性。
CC = gcc CFLAGS = -g -Wall LIBS = -lm hello:hello.c $(CC) $(CFLAGS) -o hello hello.c $(LIBS)
在這個例子中,我們定義了三個變量:CC、CFLAGS、LIBS。其中CC代表編譯器,CFLAGS代表編譯選項,LIBS代表需要鏈接的庫文件。
在編譯hello程序時,我們使用了這些變量來指定編譯規則,這使得代碼更加清晰、易於維護。
2、依賴關係的設置
在編譯一個程序時,往往需要依賴於多個源文件和庫文件。在makefile文件中,我們需要設置好這些依賴關係,這樣make命令就可以自動判斷是否需要重新編譯程序。
OBJ = hello.o world.o hello:$(OBJ) $(CC) $(CFLAGS) -o hello $(OBJ) $(LIBS) hello.o:hello.c $(CC) -c hello.c $(CFLAGS) world.o:world.c $(CC) -c world.c $(CFLAGS)
在這個例子中,我們定義了一個名為OBJ的變量,它包含了所有的目標文件。在編譯hello程序時,我們依賴於$(OBJ)中的所有目標文件。如果其中有一個目標文件發生了變化,則make命令就會重新編譯hello程序。
同時,我們針對每個源文件設置了單獨的編譯規則。這樣,當我們只修改一個源文件時,make命令只需要重新編譯這個文件,而不是重新編譯整個程序。
3、自動化變量的使用
在makefile文件中,除了常規變量外,還有一種特殊的變量,稱作自動化變量。這些變量的值是在make命令執行過程中自動生成的,用來表示目標、依賴文件、命令等。
常用的自動化變量有:
- $@:表示目標文件
- $<:表示第一個依賴文件
- $^:表示所有的依賴文件
- $?:表示比目標文件新的所有依賴文件
- $*:表示目標文件的basename
all:hello world hello:hello.o $(CC) $(CFLAGS) -o $@ $< $(LIBS) world:world.o $(CC) $(CFLAGS) -o $@ $< $(LIBS) %.o:%.c $(CC) $(CFLAGS) -c $< -o $@
在這個例子中,我們使用了自動化變量來表示目標文件、依賴文件等信息。在編譯每個目標時,make命令會自動生成相應的變量值。這種方式可以很好地簡化makefile文件的編寫,同時,也可以提高編譯規則的可維護性。
四、總結
本文介紹了Linux下常用的make命令,包括make命令的使用方法和makefile文件的編寫技巧。make命令是一種自動化編譯程序,可以很好地解決程序依賴關係的複雜問題。在編寫makefile文件時,我們需要注意設置好目標、依賴關係,同時使用變量和自動化變量來提高編譯規則的可讀性和可維護性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/286830.html