前言
很多非科班出身的工程师对项目的编译链接其实是很不熟悉的(包括作者自己),但是如果我们想自己做项目或者从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篇-变量和变量的不同赋值方式
编译链接专题第5篇-预定义变量的使用
本文目录
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
- 使用指定字符(串)替换变量值中的后缀字符(串)
- 语法格式:$(var:a=b) 或 ${var:a=b}
.替换表达式中不能有任何的空格
.make中支持使用${}对变量进行取值
示例:
src := a.c b.c c.c
obj := $(src:c=o)
test :
@echo “obj=>$(obj)”
- 使用%保留变量值中的指定字符,替换其他字符
- 语法格式:$(var:a%b=x%y)或${var:a%b=x%y}
.替换表达式中不能有任何的空格
.make中支持使用${}对变量进行取值
示例:
src := a1b.c a2b.c a3b.c
obj := $(src:a%b=x%y)
test :
@echo “obj=>$(obj)”
这个地方的"%"是通配符,指代的是"a"和"b.c"之间的所有字符。
targets : target-pattern : prereq-pattern
command1
command2
......
意义:通过target-pattern从targets中匹配子目标;再通过prereq-pattern从子目标生成依赖;进而构成完整的规则。
示例:
规则中的模式替换就是通过一条抽象的规则来生成各条具体的规则。
修改我们主线上的makefile文件如下:
#makefile
COMPILER := gcc
TARGET := hello.exe
OBJS := func.o main.o
RM := del
$(TARGET) : $(OBJS)
$(COMPILER) -o $@ $^
$(OBJS) : %.o : %.c
$(COMPILER) -o $@ -c $^
.PHONY : rebuild clean all
rebuild : clean all
all : $(TARGET)
clean :
$(RM) *o $(TARGET)
修改func.c文件,且增加一个const.c文件。
/*const.c*/
const char* g_hello = "hello makefile";
/*func.c*/
extern char* g_hello;
void foo()
{
printf("void foo() : %s\n", g_hello);
}
/*main.c*/
extern void foo();
int main()
{
foo();
return 0;
}
增加了一个.c文件,只需要修改"OBJS"变量的值就可以了。
#makefile
COMPILER := gcc
TARGET := hello.exe
OBJS := func.o main.o const.o
RM := del
$(TARGET) : $(OBJS)
$(COMPILER) -o $@ $^
$(OBJS) : %.o : %.c
$(COMPILER) -o $@ -c $^
.PHONY : rebuild clean all
rebuild : clean all
all : $(TARGET)
clean :
$(RM) *o $(TARGET)
- 一个变量名之中可以包含对其他变量的引用。
- 嵌套引用的本质是使用一个变量表示另外一个变量。
- 运行make时,在命令行定义变量。
- 命令行变量默认覆盖makefile中定义的变量。
- 用于指示makefile中定义的变量不能被覆盖。
- 变量的定义和赋值都需要使用override关键字。
- 用于在makefile中定义多行变量。
- 多行变量的定义从变量名开始到endef结束。
- 可使用override关键字防止变量被覆盖。
- define定义的变量等价于使用”=”定义的变量。
注意:多行变量的值是命令的话,那么一定在每条命令前面要使用tab键。
#makefile lesson6
hm := hello makefile
override var := override-test
test:
@echo "hm => $(hm)"
@echo "var => $(var)"
#makefile lesson6
hm := hello makefile
override var := override-test
test:
@echo "hm => $(hm)"
@echo "var => $(var)"
@echo "foo => $(foo)"
在命令行中定义的变量在makefile中是可以直接使用的。
#makefile lesson6
hm := hello makefile
override var := override-test
define foo
I'm fool
endef
override define cmd
@echo "run cmd is ..."
@dir
endef
test:
@echo "hm => $(hm)"
@echo "var => $(var)"
@echo "foo =>$(foo)"
${cmd}
- 变量值的替换:$(var:a=b) 或 ${var:a=b}
- 变量的模式替换:$(var:a%b=x%y)或${var:a%b=x%y}
- makefile执行将模式替换可以直接用于规则中
- makefile中的变量值能够嵌套引用
- 命令行中定义的变量能够覆盖makefile中定义的变量
- override用于指示makefile中定义的变量不能被覆盖
- define用于在makefile中定义值为多行的变量
参考资料:
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篇-变量和变量的不同赋值方式
编译链接专题第5篇-预定义变量的使用
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号