makefileeval – 代碼構建工具教程

一、什麼是makefileeval?

makefileeval是一個工具庫,可以幫助我們輕鬆構建C/C++代碼的編譯和安裝流程。它基於Makefile文件,提供了方便的API接口,允許我們在代碼庫中定義自己的編譯、安裝規則,並且可以跨平台使用。see example:

.PHONY: all clean install
.DEFAULT_GOAL := all
CC := g++
CFLAGS := -Wall -std=c++17

ALL_OBJS := obj/a.o obj/b.o obj/c.o

all: $(ALL_OBJS)
	$(CC) $(ALL_OBJS) -o main

obj/%.o: src/%.cc
	$(CC) $(CFLAGS) -o $@ -c $<

install:
	install main /usr/local/bin

clean:
	rm -rf obj/*.o main

在這個例子中,我們定義了三個目標,all、clean和install。其中,all目標是makefileeval中默認的目標,因此不需要手動指定執行。它將依賴obj目錄下所有的.o文件,並將它們鏈接成一個二進制文件main。我們還定義了一個規則,指定了將src目錄下的.cc文件編譯並生成對應.o文件的方法。最後,我們實現了一個安裝目標,將生成的二進制文件main安裝到系統路徑中。通過這些定義,我們可以通過運行make來完成編譯、鏈接和安裝。

二、如何使用makefileeval?

使用makefileeval可以分為兩個部分,一是在代碼庫中定義Makefile文件,二是在命令行中調用make工具。在Makefile文件的編寫中,我們需要定義好我們的編譯規則、依賴關係以及目標操作。然後在命令行中,通過執行make命令,可以根據Makefile文件定義的規則來自動編譯源代碼,生成可執行程序、動態庫、靜態庫等。see example:

all: bin/foo

bin/foo: obj/main.o obj/foo.o obj/helper.o
	mkdir -p bin
	g++ -o $@ $^

obj/main.o: src/main.cpp inc/foo.h inc/helper.h
	mkdir -p obj
	g++ -c -o $@ -Iinc src/main.cpp

obj/foo.o: src/foo.cpp inc/foo.h
	mkdir -p obj
	g++ -c -o $@ -Iinc src/foo.cpp

obj/helper.o: src/helper.cpp inc/helper.h
	mkdir -p obj
	g++ -c -o $@ -Iinc src/helper.cpp

.PHONY: clean
clean:
	rm -rf bin/foo obj/*.o

在這個例子中,我們定義了一個名為all的目標操作,它依賴於名為bin/foo的目標文件。同時bin/foo依賴obj目錄下的三個.o文件。在每一個.o文件構建規則中,我們都實現了將源文件編譯成.o文件的步驟,並在目標文件構建規則中執行鏈接操作,將所有的.o文件鏈接為最終的可執行文件。最後,clean規則用於清除編譯生成的目錄和文件。

三、如何定製makefileeval?

makefileeval允許我們在代碼庫中定義自己的編譯規則和依賴關係,幫助我們處理各種常見的編譯問題。我們可以通過修改Makefile文件中的路徑、編譯選項、依賴項、目標輸出路徑等來達到特定需求。see example:

# 使用C++20標準編譯
CXXFLAGS = -std=c++20

# 源文件目錄
SRC_DIR = src
# 對象文件目錄
BUILD = build

# 應用程序名稱和目錄
APPNAME = app
DEPLOY_DIR ?= /usr/bin

# 依賴的庫文件目錄
LIB_DIR = -L../lib
# 需要引入的第三方庫
LIBS = -lpthread -lcrypto -lssl

# 根據源文件生成.o文件
%.o: $(SRC_DIR)/%.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $(BUILD)/$@

# 編譯鏈接最終應用程序
$(APPNAME): main.o common.o tools.o
	$(CXX) $(CXXFLAGS) -o $(APPNAME) $(BUILD)/main.o $(BUILD)/common.o $(BUILD)/tools.o $(LIBS) $(LIB_DIR)

# 依賴文件更新時間戳
DEPS := $(shell find $(SRC_DIR) -name '*.h' -or -name '*.hpp' | sed 's/^/--include=/' | tr '\n' ' ')

# 向量清空
OBJ = 
OBJ += $(patsubst %.cpp, %.o, $(shell find $(SRC_DIR) -name '*.cpp'))

all: $(APPNAME)

clean:
	rm -rf $(BUILD)
	rm -rf $(APPNAME)

install: all
	install -d $(DEPLOY_DIR)
	install $(APPNAME) $(DEPLOY_DIR)

在這個例子中,我們使用了C++20標準編譯我們的代碼。定義了源文件目錄、對象文件目錄,以及應用程序名稱和目錄,依賴庫文件目錄和需引入的第三方庫。我們也重新定義了生成.o文件的規則,並定義了最終應用程序鏈接的規則。對於依賴文件,我們使用shell命令查找源文件目錄中所有的.h和.hpp文件作為依賴項,並將查找到的結果用於update的依賴項中,以保證更新和編譯的正確性。clean規則用於清除編譯生成的目錄和文件,install規則用於安裝可執行文件。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/155058.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-17 02:38
下一篇 2024-11-17 02:38

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • MQTT使用教程

    MQTT是一種輕量級的消息傳輸協議,適用於物聯網領域中的設備與雲端、設備與設備之間的數據傳輸。本文將介紹使用MQTT實現設備與雲端數據傳輸的方法和注意事項。 一、準備工作 在使用M…

    編程 2025-04-29
  • Python3.6.5下載安裝教程

    Python是一種面向對象、解釋型計算機程序語言。它是一門動態語言,因為它不會對程序員提前聲明變量類型,而是在變量第一次賦值時自動識別該變量的類型。 Python3.6.5是Pyt…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Deepin系統分區設置教程

    本教程將會詳細介紹Deepin系統如何進行分區設置,分享多種方式讓您了解如何規劃您的硬盤。 一、分區的基本知識 在進行Deepin系統分區設置之前,我們需要了解一些基本分區概念。 …

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29

發表回復

登錄後才能評論