亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

C++的Makefile怎么用

發布時間:2022-10-17 17:43:03 來源:億速云 閱讀:149 作者:iii 欄目:編程語言

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

1. Makefile基本語法與執行

為什么要使用 Makefile?

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

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

絕大多數的 IDE 開發環境都會為用戶自動編寫 Makefile。

Make 是怎么工作的?

Make 工作的原則就是:

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

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

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

除此之外,你甚至還可以在 Makefile 中儲存一些你想調用的系統終端的命令,像一個 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

結果為:

[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

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

如果文件夾中已經有.o文件,make后會提示已經生成,需要刪除.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

結果為:

[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簡化過程

使用變量: 如果調用某個文件用的次數較多,可以使用變量代替,變量可以直接替換

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

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)

命令自動推導: 我們可以發現,由于 .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)

預定義變量: 系統中自己也定義了一些變量

變量程序默認值
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就不能使用,需要使用假想目標,可以在執行命令時不查看文件夾里面的文件,直接生效

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 動態庫的建立與使用

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)

結果為:

[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

預定義變量:

還是需要在前面定義

變量程序參數
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)

自動變量:

自動變量是在規則每次執行時都基于目標和依賴產生新值的變量

自動變量含義
$<表示第一個匹配的依賴
$@表示目標
$^所有依賴
$?所有依賴中更新的文件
$+所有依賴文件不去重
$(@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中使用%作為通配符。從匹配目標格式的目標名中依據通配符抽取部分字符串,再按照抽取字符串分配到每一個依賴格式中產生依賴名。例如,使用%.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 動態加載庫的建立與使用

TARGET = simpletest2
OBJS = simple.o
LIB = libsimple.so
CXXFLAGS = -c -fPIC
LDLIBS = -ldl
TESTOBJ = simpletest2.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)

結果為:

[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怎么用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

买车| 灵台县| 清河县| 新巴尔虎左旗| 海门市| 汽车| 孟津县| 墨玉县| 越西县| 扎鲁特旗| 阿克苏市| 当涂县| 宜阳县| 大邑县| 裕民县| 文安县| 乌拉特前旗| 仲巴县| 彭山县| 开江县| 平远县| 丰城市| 株洲县| 汉川市| 海门市| 新和县| 红原县| 玉环县| 皮山县| 枞阳县| 黔西县| 临朐县| 东阳市| 镇坪县| 泽州县| 连州市| 玛沁县| 巴林左旗| 大英县| 林西县| 婺源县|