热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个超好用经典Makefile小例模板(吐血整理)

利用Makefile生成一个组件库#指定shell为bashSHELLbinbash#想要生成的组件库名称TARGET_LIB_A:libXXX.a#最终存放库文件和头文件的目录D

利用Makefile生成一个组件库

#指定shell为bash
SHELL=/bin/bash
# 想要生成的组件库名称
TARGET_LIB_A := libXXX.a
# 最终存放库文件和头文件的目录
DIST_INC := ./dist/include/component
DIST_LIB := ./dist/lib
DIST := ./dist/{ include/component/,lib/}
# 需要打包的头文件
SRC_INC := ./src/#.h \
./src/bbb.h \
./src/ccc.h
# 交叉编译链
CROSS_COMPILE=arm-himix200-linux-
CC=$(CROSS_COMPILE)gcc
CXX=$(CROSS_COMPILE)g++
AR=$(CROSS_COMPILE)ar
# C/C++编译选项
CFLAGS := -Wall -Werror
CXXFLAGS :=
# 需要编译的源代码目录
SRC_DIR:= ./src \
./src/utils
# 需要编译的源代码文件格式
SFIX:= .c .cpp
# 得到源代码目录下的所有源代码文件
SOURCES := $(foreach x,${ SRC_DIR},\ $(wildcard \ $(addprefix ${ x}/*,${ SFIX})))
# 编译时指定的头文件路径
INCLUDES := -I./src -I./include -I./include/ebase
# 去掉扩展名,再追加.o的扩展名,得到依赖文件名集合 (带路径)
OBJS_FILE := $(addsuffix .o ,$(basename ${ SOURCES}))
# 1、先清理不必要的文件
# 2、生成库文件
all : clean $(TARGET_LIB_A)
mkdir -p $(DIST) #创建存放成果物的目录
mv $(TARGET_LIB_A) $(DIST_LIB) #拷贝生成的库文件
cp $(SRC_INC) $(DIST_INC) #拷贝头文件

$(TARGET_LIB_A) : $(OBJS_FILE)
$(AR) -rcs $@ $^
@rm -f $(OBJS_FILE)
%.o : %.c
$(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
%.o : %.cpp
$(CXX) $(INCLUDES) -c $< -o $@ $(CXXFLAGS)
.PHONY: clean
clean:
rm -f $(OBJS_FILE)
rm -rf ./dist

利用Makefile生成一个可执行文件

#指定shell为bash
SHELL=/bin/bash
# 想要生成的可执行文件名称
DEMO:= demo
# 交叉编译链
CROSS_COMPILE=
CC=$(CROSS_COMPILE)gcc
CXX=$(CROSS_COMPILE)g++
# C/C++编译选项
CXXFLAGS := -Wall -Werror -Wl,-rpath=../lib/ebase
# 需要编译的源代码目录
SRC_DIR:= ./src
# 需要编译的源代码文件格式
SFIX:= .c .cpp
# 得到源代码目录下的所有源代码文件
SOURCES := $(foreach x,${ SRC_DIR},\ $(wildcard \ $(addprefix ${ x}/*,${ SFIX})))
# 指定编译时的头文件路径
INCLUDES := -I../dist/include -I./src
# 指定需要链接库的路径
LIB := -L../lib/ebase -L../dist/lib
#指定需要链接的库
LINK := -lcXXX \
-lprotoc -lm -lrt -ldl
#去掉扩展名,再追加.o的扩展名,得到依赖文件名集合 (带路径)
OBJS_FILE := $(addsuffix .o ,$(basename ${ SOURCES}))
# 1、先清理不必要的文件
# 2、生成库文件
# 3、生成可执行文件
all : clean mklib $(DEMO)

$(DEMO) : $(OBJS_FILE)
$(CXX) $(INCLUDES) -o $@ $^ $(LIB) $(LINK) $(CXXFLAGS)
@rm -f $(OBJS_FILE)

%.o : %.c
$(CC) $(INCLUDES) -c $< -o $@
%.o : %.cpp
$(CXX) $(INCLUDES) -c $< -o $@

.PHONY: mklib
mklib:
make CROSS_COMPILE= -C ../

.PHONY: clean
clean:
rm -f $(OBJS_FILE)
rm -f ${DEMO}

推荐阅读
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在 Debian 11 系统中部署 CMake 的详细步骤与最佳实践
    CMake是一个免费、开源、跨平台的工具系列,旨在构建、测试和打包软件. CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用 ... [详细]
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • C++设计模式精华:高效学习与速记指南
    本书《C++设计模式精华:高效学习与速记指南》旨在帮助读者快速掌握C++设计模式的核心概念和应用技巧。书中详细介绍了继承这一重要机制,解释了派生类如何继承基类的属性和方法,并探讨了派生类对象如何存储和使用基类的数据成员。通过实例和代码示例,读者可以更好地理解继承在实际开发中的应用,从而提升编程效率和代码质量。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 如何在Linux系统中无root权限下高效安装Perl模块?
    在Linux系统中,若没有root权限,可以通过使用`local::lib`模块来高效地安装Perl模块。这一方法在Perl官方文档`perlfaq8`中有详细记录,并且是StackOverflow上常见的讨论话题之一。通过`local::lib`,用户可以在本地目录中安装和管理Perl模块,从而避免权限问题,提高开发效率。此外,该方法还支持多个用户在同一系统上独立安装和使用不同的模块版本,增强了灵活性和安全性。 ... [详细]
  • 为了深入了解某些测试框架的工作原理,并在培训中构建一个简单的测试框架,我系统地研究了 should.js 的源代码。本文将分享我的学习过程和分析结果,帮助读者更好地掌握 should.js 的核心机制。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 我正致力于利用Azure Functions和System.IO.Compression库,将大量文件高效地压缩并存储到Azure Blob容器中。这种方法不仅提高了存储效率,还优化了数据管理流程。通过这种方式,可以显著减少存储成本,并提升数据访问速度。 ... [详细]
  • TQ210UBOOT移植笔记添加自己的单板【学习笔记】
    在uboot的源码的根目录下的readme中有介绍如何在uboot中添加自己的单板:一、在boards.cfg中添加自己的单板的信息,可以模仿smdkc ... [详细]
  • 如何判断电容好坏?
    关注+星标公众号,不错过精彩内容来源 | 电子电路怎样测量小容量电容的好坏?1、检测10pF以下的小电容,因10pF以下的固定电容器容量太小,如果用指针式用万用表进行测量,只能定性 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有