多目录工程构建Makefile的编写

Makefile构建多级目录项目 1)MakeFile是什么 根据百度: MakeFile是一个文件。 MakeFile是一个文本文件。 Makefile是make工具执行自动化编译流程的依据文本文件。 就像编译一个可执行程序一样: xxx.c是一个文件。 xxx.c是一个文本文件。 xxx.c是gcc工具执行编译的依据文本文件。 xxx.c文件需要遵守C语言语法规则去编写;同样的,Makefile文件需要遵守Makefile语...... 阅读详情

转载的一篇文章,扩展性不强,但是基本揭露了大型工程build的过程。

最近一直在研究makefile ,看了网上比较流行的文章《跟我一起写 Makefile》,还有一篇是《GNU makefile中文手册》,两者的关系是前者是后者的子集,连《跟我一起写 Makefile》作者都说了是参考《GNU makefile中文手册》来写的,感叹linux下的开发真的是奥妙无穷,每一项技术都似一顿饕餮大餐,吃起来爽,消化掉难。

make 的技术目前还只是掌握了点皮毛而已,书上的范例只是针对了同目录下的多文件的编译讲解,可是我想通常一个简单的项目也不止一个目录,于是学着写一个多目录下的的makefile,搞了一天,居然不知从何下手,晕!baidu 一下,没几篇文章介绍的,而且仅有的几篇也写得比较模糊,方法也千差万别。。。

郁闷中,突然想起自己手头的项目的GUI模块的makefile 不是咱老大写的么,醍醐灌顶...,为什么最需要的总是最后才想起?只怪自己开窍太慢!废话少说,赶紧的!!

说实话,目前所做的项目技术含量低,嵌入式开发中的GUI模块,不过这个GUI模块的规模还不小,里面还细分了好几块,正好满足我的要求,打开老大的杰作仔细端倪,跟踪打印信息,一步一步推敲(笨人的高招),还真有点开窍了,老大就是老大阿。


下面就是我自己参考老大的技术写的针对多目录的makefile

我们要编译的工程是一个主目录proj, 它下面有4个子目录: /main /ui /math /obj

其中
main中包含文件 main.c
ui 中包含了文件 ui.h ui.c
math 中包含了文件 math.h math.c
obj 用于存放最终生成的目标

他们的关系是
main.c include "ui.h" "math.h"
ui.c include "ui.h" "math.h"
math.c include "math.h"

要求是在proj 目中的obj 目录中生成 out(主程序) ui.o main.o 以及一个动态库文件 libmath.so


第一种做法是在每一个子目录中都添加一个makefile文件, 当然主目录proj中的makefile必不可少,同时还在主目录中

创建一个env.mk文件,其作用就是包含了其他makefile都用到的模式规则

--------------------- env.mk----------------------------

CC := gcc


#头文件目录

INCLUDE_DIR := \  
-I$(MAKEROOT)/ui \
-I$(MAKEROOT)/main \
-I$(MAKEROOT)/math


CFLAGS := $(INCLUDE_DIR)

#对所有的.o文件以.c文件创建它

%.o : %.c
${CC} ${CFLAGS} -c $< -o $(MAKEROOT)/obj/$@

--------------------------------------------------------

-------------------proj/makefile -----------------------

export MAKEROOT := $(shell pwd)

TARGET_DIRS := main \
               ui \
      math

include ./env.mk

define build_obj
for SubDir in $(TARGET_DIRS); do \ #对所每一个子目录如果其存在
    if ! [ -d $$SubDir ]; then \
        echo "The $$SubDir is not exist !"; \
        exit 11; \
    fi; \
    echo "Building $$SubDir ..."; \
    make -C $$SubDir ; \ #执行子目录的makefile
    if [ $$? -ne 0 ]; then \
echo "Building $$SubDir is failed !"; \
        exit 12; \
    fi; \
done

endef


all :
@$(call build_obj) #调用过程
gcc -fPIC -o out ./obj/*.o ./obj/*.so #生成最终目标
clean :
-rm ./obj/*.o ./out ./obj/*.so

--------------------------------------------------------

------------- ui/makefile main/makefile ----------------

include $(MAKEROOT)/env.mk #包括头文件,执行模式规则

SRCS := $(wildcard *.c)

OBJS := $(patsubst %.c,%.o,$(SRCS)) #生成所有.c文件对应的.o文件

.PHONY : all
all : $(OBJS)

--------------------------------------------------------

------------------ math/makefile -----------------------

.PHONY : all
all :
gcc -shared -o ../obj/libmath.so math.c math.h #生成动态库文件

--------------------------------------------------------


现在只要到proj主目录中,执行make all 命令就万事OK啦!!
Makefile文件的编写(实例详解) 在实例中我通过工程中3个C文件,学习了Makefile中变量的使用,变量的赋值,特殊符号,通配符等等。并进行多文件的编写和改进,从而学习了Makefile的基础知识和理解如何编译和链接这几个文件。... 阅读详情

相关推荐

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 202

多目录、多文件的Makefile的编写

makefile多目录设计

qq_30247635的博客 5124

自定义css属性实现渐变边框动画

自定义cs属性实现渐变边框动画

lemon的博客 1873

多文件多子目录makefile

本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 2079

大模型抽取知识图谱三元组的可行性分析

通过结合传统信息抽取模型与大语言模型的混合架构,可高效完成从学术文献到知识图谱三元组的全流程构建。分阶段优化:传统模型负责粗粒度抽取,大模型负责细粒度修正。灵活提示设计:通过少样本学习引导大模型理解领域本体。严格质量控制:结合规则引擎和人工校验,确保三元组准确性。该方案可显著提升知识图谱构建效率,适用于学术研究、企业知识库等场景。

qq_20647053的博客 1064

传感器采集信息的频率(采样频率)

较高的采集频率通常能提供更详细的信息,但也会增加数据处理和存储的负担。在某些应用中,较高的采样频率可能是必要的,而在其他情况下,则可能会选择适当的低采样频率以降低功耗和数据处理压力。传感器采集信息的频率(采样频率)是指传感器在一定时间内对输入信号进行采样的次数。对于一些需要快速检测和响应的应用,如运动传感器、声音传感器等,高采样频率是至关重要的。高采样频率通常需要更多的功耗和更大的存储容量,因为产生的数据量更大。例如,对于快速运动的对象,较低的采样频率可能无法捕捉到运动的真实轨迹。

chen的博客 5340

【Linux】一步一步教你编写单目录和多目录Makefile

本文将介绍Makefile的作用、优势、原理以及一步一步编写单目录和多目录Makefile

logani的博客 2910

通用 Makefile 的编写方法以及多目录 makefile 写法

1 make分中预定义变量表$* 不包含扩展名的目标文件名称。$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$&lt; 第一个依赖文件的名称。$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。$@ 目标的完整名称。$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标...

shaderdx的专栏 2769

荣耀Magic 6 dToF LiDAR Android阵营全球第一首发

40X30分辨率的BSI SPAD小面阵,帧率达到60帧,搭配多传感器融合算法, 可产生足够的稠密点云,为应用设备提供可靠的距离传感。在手机消费电子方案中,dToF LiDAR技术不仅提升了手机的功能和用户体验,还为手机厂商提供了差异化的竞争优势。随着技术的不断进步和市场的快速发展,我们可以期待未来dToF LiDAR技术将在手机领域发挥更大的作用,为用户带来更多创新和便捷的功能。增强现实(AR)体验:通过dToF LiDAR提供的高精度深度信息,手机可以更准确地放置虚拟物体在现实世界的表面上。

致力于lidar应用开发 19万+

【100分- 求最多可以派出多少支团队】(题目+思路+Java&C++&Python解析+在线测试)

用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或者2人组成,且1个人只能参加1个团队,计算出最多可以派出多少只符合要求的团队。

m0_73659489的博客 313

多目录工程的makefile书写示例

关于程序的编译和链接 —————————— 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成运行文件,这个动作叫作链接(link)。 编译时,编译器须要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你须要告诉编译器头文件的所在位置(头文件里应该仅仅是声明,

shirinngunn的博客 727

企业如何开展BI建设--指标体系建设

很多企业的数字化转型工作都是从做BI项目开始的,很多企业认为,BI就是做指标大屏,所以做了很多的驾驶舱,也做了很多指标,有从系统取的,有手工填报的,甚至手工填报的比例占到了70%,最终BI沦为了填报系统,业务认为BI就是把从线下的微信沟通转到了线上录入展示,并没有给业务代来任何提升,久而久之,BI大屏就没人关心,公司高层也认为数据都是填报的,都经过了加工处理,这种数据不可信,不能反映业务开展的实际。其实在BI系统建设之前,我们首先要做的就是要梳理企业的指标,到底我们要展示哪些指标?

262

Makefile.am文件详解

原文:https://blog.youkuaiyun.com/u013485792/article/details/51355668 Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候,就将Makefile.in文件自动生成Makefile文件了。所以Makefile.am文件是比Makefile文件更高的抽象。 下面我根据自己的工作中的一些应用,来讨论Makefil

天涯路的专栏 9928

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从基础到进阶:Ubuntu 18.04 下 GCC 与 Makefile 构建 C 程序完全指南

本文系统梳理了 Ubuntu 18.04 系统中利用 GCC 编译器与 Makefile 构建 C 程序的完整流程,从环境准备、基础概念解析,到多文件模块化开发、分步编译链接实操,再到 Makefile 高级应用(多目录适配、调试 / 发布多模式构建),形成了从入门到进阶的系统化指南。文中还对比了 Ubuntu 与 Windows、macOS 平台的编译工具链差异,提供了跨平台开发适配建议、常见问题排查方案及 GDB 调试基础技巧。通过实践与总结,不仅明确了程序从文本代码到可执行文件的预处理、编译、汇编等

oz050223的博客 1103

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

CMake基础介绍

CMake 是一个项目构建工具,并且是跨平台的;

sky的博客 1908

Makefile文件的编写

一、为什么需要Makefile makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 二、Makefile的好处 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的

weixin_45730790的博客 870

C语言Makefile编写教程:从入门到工程实践

在C/C++开发中,自动化构建工具是提升开发效率、管理复杂依赖关系的关键技术。Makefile作为经典的构建工具,其核心原理基于依赖关系和增量编译机制,通过定义目标、依赖和命令来实现自动化编译流程。这一技术价值在于显著减少重复劳动,加速大型项目的构建过程,尤其适用于嵌入式开发、系统软件等场景。通过掌握变量、函数和模式规则等高级用法,开发者可以编写出高效、可维护的构建脚本,实现多目录项目管理和头文件依赖自动处理,从而将Makefile应用于实际工程中,优化C语言项目的构建流程。

weixin_30824599的博客 492

告别命令行手忙脚乱:用Makefile一键搞定UVM+VCS验证环境(附1.1a库配置)

本文详细介绍了如何利用Makefile自动化UVM+VCS验证环境的编译和运行流程,解决手动输入复杂命令的痛点。通过配置UVM 1.1a库和优化Makefile.vcs模板,实现一键编译、运行和清理,显著提升IC验证工程师的工作效率。文章还分享了多目录处理、参数化构建等进阶技巧,助力验证环境的高效管理。

weixin_28704565的博客 388

多目录下多文件 makefile编写

前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;         在做项目时,一般文件都会分几个目录来存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,这几个文件;我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    .

YuZhiHui_No1的专栏 1万+

Linux下Makefile构建项目+高频面试题目总结

本文详细介绍了Makefile的编写方法,从基础到进阶逐步讲解。主要内容包括:1. Makefile核心概念:规则结构(目标、依赖、命令)、伪目标的作用;2. 基础示例:单个源文件的编译和清理;3. 进阶技巧:多文件项目中的变量定义、自动变量($@,$^,$<)使用、模式规则;4. 工业级项目实践:目录结构设计、分层编译规则、依赖管理;5. 常见面试题解析:基础概念、语法实操、工程优化和问题排查。文章通过大量示例展示了如何编写高效、可维护的Makefile,特别适合C/C++项目构建。

2301_80486723的博客 576

Linux下Makefile实战:从父子依赖到自动化编译的5个关键技巧

本文深入探讨了Linux环境下Makefile的实战应用,重点解析了从理解依赖关系到实现自动化编译的5个核心技巧。文章详细阐述了如何通过精准管理依赖关系、规避常见陷阱、使用变量与模式规则、自动化管理头文件依赖以及构建多目录项目,来打造一个健壮、高效的自动化构建系统,从而显著提升C/C++项目的开发与编译效率。

tgb345678的博客 620

linux--多目录下的MakeFile文件(嵌套Makefile)编写

linux--多目录下的makefile文件编写1 简介2 步骤3 示例3.1 文件根目录下的文件3.2 这个是工程中除了include,lib外的目录结构3.3 根目录下的makefile文件3.4 OBJ文件中的makefile3.5 CPE_54_08文件目录下的makefile3.6 Business文件下的makefile3.7 MXDatabase文件下的makefile3.8 Soc...

天道酬勤 8436

多目录下的makefile文件编写

222

Stephen 6134

Makefile实例,利用Makefile给多文件、多目录C源码建立工程

前言 粉丝留言,想知道如何使用Makefile给多个文件和多级目录建立一个工程,必须安排!

一口Linux的专栏 3656

多目录工程的makefile示例

本文来源于:http://www.360doc.com/content/12/0403/08/1317564_200410720.shtml转载请注明出处 本文代码虽简单,但涉及比较复杂的各种调用关系,欲研究者需有耐心及清醒头脑。 切切!背景交待: 1、正在移植U-Boot,并对其源代码进行了一些分析,感觉它的Makefile十分强劲; 2、以前写的Makefile模板不

mu0206mu的专栏 4395
上一篇: make中的一些常见符号
下一篇: 查看进程消耗的内存
coding_Xu
博客等级 码龄15年 11粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值