一、什麼是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-tw/n/155058.html