前言
很多非科班出身的工程师对项目的编译链接其实是很不熟悉的(包括作者自己),但是如果我们想自己做项目或者从0到1实现一个项目,或者想要优化程序,或者要修改memory layout,或者要实现AUTOSAR架构下内存保护,编译链接是必不可少的知识。本着打破沙锅学到底的目的,我们决定从0到1实现一个Windows操作系统下基于AUTOSAR架构的编译环境,同时为了锻炼我们的代码能力,从0到1实现一个常用的数据结构库,如果有比较优秀的开源AUTOSAR代码也计划加入进去。计划手写整个工程的makefile使用make工具能直接编译工程,同时编写CMakeLists文件,支持CMake生成makefile文件来编译整个工程。
对编译链工具不熟悉的,可以参考这篇文章:https://blog.51cto.com/xiacaojun/5648507
我们将使用的工具:
项目构建生成工具:CMake
项目构建工具:make
编译器:
Windosw: gcc/g++
TC3xx: Green Hills (GHS)
关于Window下CMake入门安装请参考这篇文章:Windows下CMake的小白级入门使用教程(hello world)
专题文章:
编译链接专题第1篇-make和makefile介绍
编译链接专题第2篇-初识makefile结构
编译链接专题第3篇-初识makefile中的伪目标
编译链接专题第4篇-变量和变量的不同赋值方式
本文目录
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
在makefile中存在一些预定义的变量
-- 自动变量
如:$@, $^, $<, e.g.
-- 特殊变量
如:$(MAKE), $(MAKECMDGOALS), $(MAKEFILE_LIST), $(MAKE_VERSION), $(CURDIR), $(.VARIABLES) , e.g.
- $@
当前规则中触发命令被执行的目标
- $^
当前规则中的所有依赖
- $<
当前规则中的第一个依赖
#makefile lesson5 test
.PHONY : first second third
all : first second third
@echo "$$@ => $@"
@echo "$$^ => $^"
@echo "$$< => $<"
first:
second:
third:
注意:
1.“$”对于makefile有特殊含义。想要输出”$”符号需要加上一个”$”进行转义。
2.”$@”对于Bash Shell (Linux System)有特殊含。想要输出”$@”符号需要加上”\”进行转义,我们这里是Power Shell,不加”\”也能正常输出”$@”.
使用预定义变量修改我们主线(上一篇的makefile)文件。
#makefile
COMPILER := gcc
TARGET := hello.exe
$(TARGET) : func.o main.o
$(COMPILER) -o $@ $^
func.o : func.c
$(COMPILER) -o $@ -c $^
main.o : main.c
$(COMPILER) -o $@ -c $^
.PHONY : rebuild clean all
rebuild : clean all
all : $(TARGET)
clean :
del *o $(TARGET)
使用自动变量的好处:添加新的依赖的时候,命令中的$^不用修改。
$(MAKE)
当前make解释器的文件名。
$(MAKECMDGOALS)
命令行中指定的目标名(make的命令行参数)。
$(MAKEFILE_LIST)
make所需要处理的makefile文件列表。
当前makefile的文件名总是位于列表的最后。
文件名之间以空格进行分隔。
.PHONY : all out first second third
all out : first second third
@echo "$(MAKE)
@echo "$(MAKECMDGOALS)"
@echo "$(MAKEFILE_LIST)"
注意:打印的"makefile"文件名之前有一个空格。
.PHONY : all out first second third
all out : first second third
@echo "$(MAKE)
@echo "$(MAKECMDGOALS)"
@echo "$(MAKEFILE_LIST)"
first:
@echo "first"
second:
@echo "second"
third:
@echo "third"
test :
$(MAKE) first -f $(MAKEFILE_LIST)
$(MAKE) second -f $(MAKEFILE_LIST)
$(MAKE) third -f $(MAKEFILE_LIST)
在大型的软件开发过程当中,makefile是分成好几个不同的子文件来编写的,这些makefile文件之间还可以进行相互的调用。
$(MAKE_VERSION)
当前make解释器的版本。
$(CURDIR)
当前make解释器的工作目录。
$(.VARIABLES)
所有已经定义的变量名列表。
#makefile lesson5 test
.PHONY : test1 test2
test1 :
@echo "$(MAKE_VERSION)"
@echo "$(CURDIR)"
@echo "$(.VARIABLES)"
我们在实际工程开发的时候,可以通过一个特殊的变量".VARIABLES"看看当前make解释器当中支持哪些预定于的变量。
#makefile lesson5 test
.PHONY : test1 test2
AUTOSAR := Auto System Architecture
test1 :
@echo "$(MAKE_VERSION)"
@echo "$(CURDIR)"
@echo "$(.VARIABLES)"
test2:
@echo "$(RM)" ##RM is the variable that is predetermined to
问题:如果我们在windows系统中使用RM这个预定义变量会报错?
#makefile
COMPILER := gcc
TARGET := hello.exe
$(TARGET) : func.o main.o
$(COMPILER) -o $@ $^
func.o : func.c
$(COMPILER) -o $@ -c $^
main.o : main.c
$(COMPILER) -o $@ -c $^
.PHONY : rebuild clean all
rebuild : clean all
all : $(TARGET)
clean :
$(RM) *o $(TARGET)
解决办法:自定义RM变量。
#makefile
COMPILER := gcc
TARGET := hello.exe
RM := del
$(TARGET) : func.o main.o
$(COMPILER) -o $@ $^
func.o : func.c
$(COMPILER) -o $@ -c $^
main.o : main.c
$(COMPILER) -o $@ -c $^
.PHONY : rebuild clean all
rebuild : clean all
all : $(TARGET)
clean :
$(RM) *o $(TARGET)
怎么去了解更多的预定义变量?
首先打印make中所有的预定义变量,然后搜索自己想了解的变量。
https://www.gnu.org/software/make/manual/make.html
.makefile提供了预定义变量供开发者使用。
.预定义变量的使用能够使得makefile的开发更高效。
.自动变量是makefile中最常见的元素。
.使用$(.VARIABLES)能够获取所有的特殊变量。
参考资料:
1.狄泰软件唐老师课程
2.专业嵌入式软件开发书籍
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
TC3xx芯片GTM模块-CMU,CCM,TBU详解
TC3xx芯片GTM模块-TOM详解
AUTOSAR架构下PWM模块配置实践
TC3xx芯片GTM模块-TIM详解
AUTOSAR架构下ICU模块配置实践
TC3xx芯片电源管理系统PMS详解
TC3xx DMA模块详解
编译链接专题第1篇-make和makefile介绍
编译链接专题第2篇-初识makefile结构
编译链接专题第3篇-初识makefile中的伪目标
编译链接专题第4篇-变量和变量的不同赋值方式
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号