最近,我在github上下载了一个stm32项目工程文件,一个项目文件能够支持多款CPU,它的做法如下所示:
第一步:在Manage Project Items中的Project Targets中创建多个目标:
每一个目标可以创建各自的文件夹,各自的文件夹可以导入各自需要的源文件,这是没有什么疑问的。值得注意的是,当前项目各个目标创建的文件夹以及文件夹中的文件都是一样的,尤其是CORE文件夹中包含多个CPU各自需要的启动汇编文件,如下所示:
这样完成后,我们就得到了6个目标,每一个目标对应各自文件夹和文件。
下一步就是每一个目标,指定对应的芯片以及头文件路径等,如图所示:
这样配置好之后,如果直接编译是会提示很多报错的,原因很明显,因为CORE文件夹中有多个相同功能的启动汇编文件。
解决方法有两种,一种就是将多余的启动文件删除掉;第二种办法就是使用keil MDK能够支持每一个文件指定是否包含在目标中的操作。
然后去掉复选框“Include in Target Build”这样选项,这样文件就有了交通上的“禁止驶入”标志。
这样CORE文件夹包含了多余启动汇编文件,但是因为配置“不包含”所以也不会变成成目标文件。
注意:去除复选框“Include in Target Build”后,下面的另外一个复选框“Always Build”的三种状态:空、灰色选中、实色选中都不起作用,文件图标上都是“梅花+禁止驶入”标志。
所以,图标上的“禁止驶入”标志优先级很高,禁止驶入的意思就是文件不包含在项目中。
(2)图标上的“梅花”标志
梅花标志当“Always Build”空选或者实选时都能显示,只有虚选时不显示梅花标志:
有没有梅花标记,文件都会被编译成目标文件,有没有梅花标志的区别是否支持重定位。
有梅花标志的文件,里面声明的全局变量和函数,可以在多个没有梅花标志的文件中定义,这些全局变量和函数定义重名但是编译不报错,这就叫重定位。
没有梅花标志的文件,里面声明的全局变量和函数只能在一个没有梅花标志的文件中定义。
参考文章:
keil文件出现雪花,去除雪花以及雪花的作用_keil工程文件有个雪花-CSDN博客
https://blog.csdn.net/weixin_60324241/article/details/143650602
总结:禁止驶入的那个选项,尤其是空选时起的“不被包含编译”起的作用最大;至于梅花标志的那个选项,以及对应的重定位作用,我们在keil使用过程中使用不多,因为keil MDK项目使用最多的就是“全局变量和公共函数在整个项目中只有一处定义”。