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/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

发表回复

登录后才能评论