make--打造专业的编译环境

一.项目的目录结构


分析
A.项目被划分为多个不同模块
1.每个模块的代码用一个文件夹进行管理--文件夹由inc,src,makefille构成
2.每个模块的对外函数声明统一放置于common/inc中--如:commom.h xxxfunc.h
B.需要打造的编译环境
1.编码文件夹在编译时不能被改动
2.在编译时自动创建文件夹用于存放编译结果
3.编译过程中能够自动生成依赖关系,自动搜索需要的文件
4.每个模块可以拥有自己独立的编译方式
5.支持调试版本的编译选项
C.解决方案的设计
第1阶段:将每个模块中的代码编译成静态文件

第2阶段:将每个模块的静态文件链接成最终可执行程序

二.实现

第一阶段
1.完成可用于各个模块编译的makefile文件
2.每个模块的编译结果为静态库文件(.a文件)
关键的实现要点:
1.自动生成依赖关系(gcc -MM)
2.自动搜索需要的文件(vpath)
3.将目标文件打包为静态库文件(ar crs)


编译实现

对应项目的目录结构,对应的文件夹下包含着相应的头文件和源文件

运行的结果如图所示

在module文件夹和main文件夹下分别新建makefile,复制当前的makefile,在build新建module和main的空文件夹,运行make all命令都可以生成.o文件,实现了各个模块编译的makefile文件
第二阶段任务:
1.完整编译整个工程的makefile文件
2.调用模块makefile编译生成静态库文件
3.链接所有模块的静态库文件,最终得到可执行程序

关键的实现要点
1.如何创建build文件夹以及子文件夹
2.如何进入每一个模块文件夹进行编译
3.编译成功后如何链接所有模块静态库
解决方案设计
1.定义变量保存模块名列表
2.利用Shell中的for循环遍历模块名变量
3.在for循环在进入模块文件夹进行编译
4.循环结束后链接所有的模块静态库文件

链接的注意事项
A.gcc在进行静态库链接时必须遵循严格的依赖关系
1.gcc -o app.out x.a y.a z.a《==》其中的依赖关系必须为:x.a->y.a,y.a->z.a;默认情况下遵循自左向右的依赖关系
2.如果不清楚库间的依赖,可以使用-Xlinker自动确定依赖关系
gcc -o app.out -Xlinker(x.a y.a z.a -Xlinker)
运行代码及运行结果图如图所示

在makefile中可以知道 可以一步一步的进行make也可以一步完成makefile


结果对比图

三. 可能出现的问题
A.所有模块makefile中使用的编译路径均为写死的绝对路径,一旦项目文件夹移动,编译必将失败

解决方案:
1.在工程makefile中获取项目的源码路径
2.根据项目源码路径:a:拼接得到编译文件的路径(DIR_BUILD),b:拼接得到全局包含路径(DIR_COMMON_INC)
3.通过定义命令行变量将路径传递给模块makefile
代码的实现:
对之前的代码进行该动的地方(红线进行了标出)

运行的结果

通过对每个文件夹的makefile进行修改 对每个makefile中的每个绝对路径进行删除 发现运行的结果没有改变

#####################################
B.所有模块makefile的内容完全相同
当模块makefile需要该动时,将涉及多处相同的改动

解决方案:
1.将模块makefile拆分为两个模板文件
mod-cfg.mk 定义可能改变的变量
mod-rule.mk 定义相对稳定的变量和规则
2.默认情况下
模块makefile复用模板文件实现功能(include)
关键问题:
1.模块makefile如何知道模板文件的具体位置
2.解决方案:通过命令行变量进行模板文件位置的传递
实现:

.运行结果如图:

四 :小结
1.大型项目的编译环境是由不同makefile构成的
2.编译环境的设计需要依据项目的整体构架设计
3.整个项目的编译过程可以分解为不同阶段
4.根据不同的阶段有针对性的对makefile进行设计
5.makefile也需考虑复用性和维护性等基本程序特性

原文地址:https://blog.51cto.com/13475106/2358456

时间: 2024-10-10 20:36:41

make--打造专业的编译环境的相关文章

makefile(08)_打造专业的编译环境

20.打造专业的编译环境(上)_模块Makefile设计 20.0. 实验材料 项目架构:其中各个文件的内容请自己填写. 20.1.大型项目的目录结构(无第三方库) 20.2.项目架构设计分析 项目被划分为不同的多个模块:每个模块用一个文件夹进行管理,文件由inc, src, makefile构成每个模块的对外函数统一放置于common/inc中,如common.h xxxfunc.h 20.3.项目目标 工程项目中不希望源文件夹在编译时被改动(只读文件夹)在编译时自动创建文件夹(build)用

打造专业的编译环境(十四)

在一些大型的项目中,它的结构是很复杂的.比如下面这个 我们来分析下这个项目的架构,项目被划分为多个不同模块.每个模块的代码用一个文件夹进行管理,文件夹由 inc,src,makefile 组成:每个模块的对外函数声明统一放置于 common/inc 中,如:common.h xxxfunc.h. 那么我们需要打造的编译环境是:1.源码文件夹在编译时不能被改动(只读文件夹):2.在编译时自动创建文件夹(build)用于存放编译结果:3.编译过程中自动生成依赖关系,自动搜索需要的文件:4.每个模块可

第二十一课 打造专业的编译环境(中)

1 .PHONY : all compile link clean rebuild 2 3 MODULES := common 4 module 5 main 6 7 MKDIR := mkdir 8 RM := rm -fr 9 10 CC := gcc 11 LFLAGS := 12 13 DIR_PROJECT := $(realpath .) 14 DIR_BUILD := build 15 DIR_BUILD_SUB := $(addprefix $(DIR_BUILD)/, $(MO

第二十二课 打造专业的编译环境(下)

顶层目录如下: 顶层makefile: 1 include pro-cfg.mk 2 include cmd-cfg.mk 3 include pro-rule.mk cmd-cfg.mk: 1 AR := ar 2 ARFLAGS := crs 3 4 CC := gcc 5 LFLAGS := 6 CFLAGS := -I$(DIR_INC) -I$(DIR_COMMON_INC) 7 8 ifeq ($(DEBUG),true) 9 CFLAGS += -g 10 endif 11 12

爱加密出席2014可信云服务大会,协力打造移动App安全环境

2014年7月15日和7月16日,在工业和信息化部指导下,2014可信云服务大会在北京国际会议中心第一会议厅隆重召开.中国通信标准化协会秘书长杨泽民.中央国家机关政府采购中心主任王力达.工信部电信研究院院长曹淑敏.工信部总工程师张峰.工信部通信发展司副司长陈家春.财政部政府采购管理办公室主任王瑛等出席会议. 目前,云计算在国内已经进入快速发展阶段,用户对于云服务的接受程度也大幅提高,产业具有良好的发展前景.在该产业蓬勃发展的同时,云计算市场也存在鱼龙混杂,服务质量参次不齐,导致用户不信任,给云计

打造Linux三流娱乐环境,二流办公环境,一流Java开发环境

写这篇文章的目的首先是为让自己以后再装linux环境时候,不用再通宵google+百度,做个备忘录,其次,给新入Linux环境的同学分享一点个人经验,再高尚点的动机也算是想做为开源技术的传播布道者.我在一开始,准备使用ubuntu,其实如果不是特别介意debian系和redhat系的区别完全可以装ubuntu,在通用linux命令和Shell脚本而言,尤其是做Java开发而言,其实二者差别不大,而且 ubuntu中文社区支持的更好,更适合个人机器安装,但我这个人有点强迫症,所以坚持了redhat

Opencv246+vs2012生成不依赖编译环境的exe文件

从测试员到测试负责人 原著:罗萝 审核.整理:jls 从测试员到测试负责人的本质改变是开始承担管理责任,测试负责人作为组织中的最基层管理者,除了执行相关能力的继续提升外,需要开始担任部分管理职能.从一个执行者开始转变为一个管理者,主要的变化有以下几点: 1:责任范围的改变 纯粹的执行者原则上只需要为自己的执行工作负责即可:而管理者需要对自己管理范围内的所有工作负责,即使不是自己执行的工作,也要负管理责任. 对于执行者,我们会希望他们有超出自己职责范围的责任心,这会有助于其个人能力的发展和进步,也

NotePad++ 配置C/C++编译环境

如果只是测试小程序可以用这种方法 比较方便,如果对于大程序建议使用专业的IDE. 经常需要写一些小程序来运行,又不想运行Visual Studio.Eclipse这样的环境,而Notepad++是一个好的选择,下面介绍如何在Notepad++中配置C.C++编译环境. 为便于编程,打开notepad-->设置-->首选项...-->备份与自动完成 , 勾选 所有输入均启用自动完成(选择函数自动完成或者单词自动完成,凭个人喜好), 勾选 输入时提示函数参数. 先提醒下大家,运行命令前,要先

打造自己的开发环境

前言:大多数时候自己都是在写C++程序,本文记录一下打造自己的开发环境的过程,方便以后查阅,免得某些东西记不起来的时候还要去百度找.打造的开发环境是代码在Linux服务器上(构建)编译-链接-运行,在windows环境编辑代码. 用到的工具: VMware-workstation : 虚拟机 ubuntu-16.04.5-server :Linux服务器版 MobaXterm : SSH连接工具 sublime : 文本编辑器 Linux上需要安装的工具:openssh-server  samb