溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的Makefile如何使用

發(fā)布時間:2022-03-28 10:40:21 來源:億速云 閱讀:339 作者:iii 欄目:大數(shù)據(jù)

這篇“C++的Makefile如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++的Makefile如何使用”文章吧。

1. Makefile基本語法與執(zhí)行

為什么要使用 Makefile?

Makefile 文件描述了整個工程的編譯、鏈接的規(guī)則。

為工程編寫 Makefile 的好處是能夠使用一行命令來完成“自動化編譯”。只需提供一個(通常對于一個工程來說會是多個)正確的 Makefile,接下來每次的編譯都只需要在終端輸入“make”命令,整個工程便會完全自動編譯,極大提高了效率。尤其是在編譯一個僅有一小部分文件被改動過的大項目的情況下。

絕大多數(shù)的 IDE 開發(fā)環(huán)境都會為用戶自動編寫 Makefile。

Make 是怎么工作的?

Make 工作的原則就是:

一個目標文件當且僅當在其依賴文件(dependencies)的更改時間戳比該目標文件的創(chuàng)建時間戳新時,這個目標文件才需要被重新編譯。

Make 工具會遍歷所有的依賴文件,并且把它們對應的目標文件進行更新。編譯的命令和這些目標文件及它們對應的依賴文件的關系則全部儲存在 Makefile 中。

Makefile 中也指定了應該如何創(chuàng)建,創(chuàng)建出怎么樣的目標文件和可執(zhí)行文件等信息。

除此之外,你甚至還可以在 Makefile 中儲存一些你想調(diào)用的系統(tǒng)終端的命令,像一個 Shell 腳本一樣使用它。

作用:

Makefile 文件告訴 Make 怎樣編譯和連接成一個程序

可用命令 dnf install make 安裝make功能

格式:

按如下格式編寫 Makefile

目標(target): 依賴(prerequiries)...
  命令(command)

注意:每個命令行前面必須是一個Tab字符,即命令行第一個字符是Tab

實驗:

vim Makefile 編輯文件:

simpletest:simple.o simpletest.o
        g++ simple.o simpletest.o -o simpletest
simple.o:simple.cpp
        g++ -c simple.cpp -o simple.o
simpletest.o:simpletest.cpp
        g++ -c simpletest.cpp -o simpletest.o

結(jié)果為:

[root@foundation1 shishi]# make
g++ -c simple.cpp -o simple.o
g++ -c simpletest.cpp -o simpletest.o
g++ simple.o simpletest.o -o simpletest

命令上下是有順序的,上一行對下一行具有依賴關系

如果文件夾中已經(jīng)有.o文件,make后會提示已經(jīng)生成,需要刪除.o文件后再make

clean的作用: 被指定時會刪除對應.o文件,避免上述情況

simpletest:simple.o simpletest.o
        g++ simple.o simpletest.o -o simpletest
simple.o:simple.cpp
        g++ -c simple.cpp -o simple.o
simpletest.o:simpletest.cpp
        g++ -c simpletest.cpp -o simpletest.o
clean:
        rm simpletest simple.o simpletest.o

結(jié)果為:

[root@foundation1 shishi]# make clean
rm simpletest simple.o simpletest.o
[root@foundation1 shishi]# make
g++ -c simple.cpp -o simple.o
g++ -c simpletest.cpp -o simpletest.o
g++ simple.o simpletest.o -o simpletest

2. Makefile簡化過程

使用變量: 如果調(diào)用某個文件用的次數(shù)較多,可以使用變量代替,變量可以直接替換

變量定義: 變量 = 字符串
變量使用: $(變量名)

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o simpletest.o

$(TARGET):$(OBJS)
        g++ $(OBJS) -o $(TARGET)
simple.o:simple.cpp
        g++ -c simple.cpp -o simple.o
simpletest.o:simpletest.cpp
        g++ -c simpletest.cpp -o simpletest.o
clean:
        rm $(TARGET) $(OBJS)

命令自動推導: 我們可以發(fā)現(xiàn),由于 .cpp 文件都是生成對應的 .o 文件,所以 makefile 文件是可以自動識別的

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o simpletest.o

$(TARGET):$(OBJS)
        g++ $(OBJS) -o $(TARGET)
simple.o:simple.cpp
simpletest.o:simpletest.cpp
clean:
        rm $(TARGET) $(OBJS)

預定義變量: 系統(tǒng)中自己也定義了一些變量

變量程序默認值
CCC語言編譯程序cc
CXXC++編譯程序g++
ARC++打包程序ar
CPP帶有標準輸出的C語言預處理程序$(CC) -E
RM刪除命令rm

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o simpletest.o

$(TARGET):$(OBJS)
        $(CXX) $(OBJS) -o $(TARGET)
simple.o:simple.cpp
simpletest.o:simpletest.cpp
clean:
        $(RM) $(TARGET) $(OBJS)

假想目標: 如果文件夾中有clean文件,那么make clean就不能使用,需要使用假想目標,可以在執(zhí)行命令時不查看文件夾里面的文件,直接生效

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o simpletest.o

.PHONY: clean

$(TARGET):$(OBJS)
        $(CXX) $(OBJS) -o $(TARGET)
simple.o:simple.cpp
simpletest.o:simpletest.cpp
clean:
        $(RM) $(TARGET) $(OBJS)

建議不生成目標文件的命令都設為假想目標

3. Makefile生成并使用庫

3.1 動態(tài)庫的建立與使用

vim Makefile 編輯文件:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC

.PHONY: clean

$(TARGET):$(LIB) simpletest.o
        $(CXX) simpletest.o -o $(TARGET) -L. -lsimple
$(LIB):$(OBJS)
        $(CXX) -shared $(OBJS) -o $(LIB)
simple.o:simple.cpp
        $(CXX) $(CXXFLAGS) simple.cpp -o $(OBJS)
simpletest.o:simpletest.cpp
        $(CXX) $(CXXFLAGS) simpletest.cpp -o simpletest.o
clean:
        $(RM) $(TARGET) $(OBJS) $(LIB)

結(jié)果為:

[root@foundation1 shishi]# make clean
rm -f simpletest simple.o libsimple.so
[root@foundation1 shishi]# make
g++ -c -fPIC simple.cpp -o simple.o
g++ -shared simple.o -o libsimple.so
g++ -c -fPIC simpletest.cpp -o simpletest.o
g++ simpletest.o -o simpletest -L. -lsimple

預定義變量:

還是需要在前面定義

變量程序參數(shù)
CFLAGS用于C編譯器的額外標志
CXXFLAGS用于C++編譯器的額外標志
ARFLAGS用于C/C++打包器的額外標志
LDFLAGS鏈接庫路徑-L
LDLIBS鏈接庫-l

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDFLAGS = -L.
LDLIBS = -lsimple

.PHONY: clean

$(TARGET):$(LIB) simpletest.o
        $(CXX) simpletest.o -o $(TARGET) $(LDFLAGS) $(LDLIBS)
$(LIB):$(OBJS)
        $(CXX) -shared $(OBJS) -o $(LIB)
simple.o:simple.cpp
        $(CXX) $(CXXFLAGS) simple.cpp -o $(OBJS)
simpletest.o:simpletest.cpp
        $(CXX) $(CXXFLAGS) simpletest.cpp -o simpletest.o
clean:
        $(RM) $(TARGET) $(OBJS) $(LIB)

自動變量:

自動變量是在規(guī)則每次執(zhí)行時都基于目標和依賴產(chǎn)生新值的變量

自動變量含義
$<表示第一個匹配的依賴
$@表示目標
$^所有依賴
$?所有依賴中更新的文件
$+所有依賴文件不去重
$(@D)目標文件路徑
$(@F)目標文件名稱

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDFLAGS = -L.
LDLIBS = -lsimple

.PHONY: clean

$(TARGET):simpletest.o $(LIB)
        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)
$(LIB):$(OBJS)
        $(CXX) -shared $^ -o $@
simple.o:simple.cpp
        $(CXX) $(CXXFLAGS) $< -o $@
simpletest.o:simpletest.cpp
        $(CXX) $(CXXFLAGS) $< -o $@
clean:
        $(RM) $(TARGET) $(OBJS) $(LIB)

自動匹配:

通配符主要用于匹配文件名,makefile中使用%作為通配符。從匹配目標格式的目標名中依據(jù)通配符抽取部分字符串,再按照抽取字符串分配到每一個依賴格式中產(chǎn)生依賴名。例如,使用%.o:%.cpp

可以讓重復的語句合為一句

makefile 文件可改為:

TARGET = simpletest
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDFLAGS = -L.
LDLIBS = -lsimple
TESTOBJ = simpletest.o

.PHONY: clean

$(TARGET):$(TESTOBJ) $(LIB)
        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)

$(LIB):$(OBJS)
        $(CXX) -shared $^ -o $@

$(TESTOBJ) $(OBJS):%.o:%.cpp
        $(CXX) $(CXXFLAGS) $< -o $@

clean:
        $(RM) $(TARGET) $(OBJS) $(LIB) $(TESTOBJ)

C++的Makefile如何使用

3.2 動態(tài)加載庫的建立與使用

TARGET = simpletest2
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDLIBS = -ldl
TESTOBJ = simpletest2.o

.PHONY: clean

# 生成可執(zhí)行文件
$(TARGET):$(TESTOBJ) $(LIB)
        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)

# 生成庫
$(LIB):$(OBJS)
        $(CXX) -shared $^ -o $@

# 生成目標文件
$(TESTOBJ) $(OBJS):%.o:%.cpp
        $(CXX) $(CXXFLAGS) $< -o $@

clean:
        $(RM) $(TARGET) $(OBJS) $(LIB) $(TESTOBJ)

結(jié)果為:

[root@foundation1 C++7.4]# make clean
rm -f simpletest2 simple.o libsimple.so simpletest2.o
[root@foundation1 C++7.4]# make
g++ -c -fPIC simpletest2.cpp -o simpletest2.o
g++ -c -fPIC simple.cpp -o simple.o
g++ -shared simple.o -o libsimple.so
g++ simpletest2.o -o simpletest2  -ldl
[root@foundation1 C++7.4]# ./simpletest2
Simple()
Test()
~Simple()

以上就是關于“C++的Makefile如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI