最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处恳请指正。原文网址:https://mcuoneclipse.com/2017/07/22/tutorial-makefile-projects-with-eclipse/
像Eclipse这样的IDE的好处是它使得处理项目的工作变得非常容易。因为它不但可以生成文件,而且可以获取并自动地管理Makefile文件。但有时这可能不是我想要的,因为我需要更大的灵活性和控制,或者我想要为我的持续集成和自动化测试系统使用相同的制作文件。在这种情况下,就需要自己编写Makefile文件。
有一件事不排除其他内容:本文介绍如何使用Eclipse中的makefiles与Eclipse中托管构建系统相似的舒适度,但是具有无限制的make files:
概要
Eclipse附带一个内置的构建系统(managed make):我可以配置编译器链接器设置,Eclipse会处理其余的事情。在本教程中,我将介绍如何使用Eclipse手动创建和使用精心制作的make files。所推荐的make files和模板可以方便地使用make来控制构建系统。所提出的方法要求添加到项目中的每个新的源文件需要扩展make文件,而是对所有包含的头文件的自动生成依赖文件的make文件进行扩展。
使用make文件的好处是:
make文件方法需要了解构建过程,为此,了解什么与管理make一起使用是有帮助的,所以我可以将其用作基础或灵感。
前提条件
要在Eclipse中使用make文件,我需要以下内容:
Eclipse IDE。我正在使用恩智浦MCUXpresso IDE v10.0.2(基于Neon),但任何其他Eclipse发行版也可以这样做。
使用make实用程序安装GNU工具链。通常这里附带了一个捆绑的Eclipse IDE,或者您可以使用DIY工具链。
您的目标设备的编译器和链接器设置。使用现有示例项目中的选项。
启动和链接器文件。再次,您可以借用现有的示例项目。
应用源文件。我建议先从“空”main函数开始。
获取必要的文件和选项的一个好方法是查看一个通常使用“manged make”的示例项目。
�我把这个项目的来源放在了GitHub上。在本文末尾的“链接”部分,检查GitHub项目的链接。
来自Eclipse受托管Make
使用受管制作系统,Eclipse会检测项目中存在的文件(例如* .c)并自动生成make文件:
生成器设置
这样生成make文件:
生成Make文件
通过构建工具集成,我有一个GUI可以设置工具的选项:
管理构建工具设置
所有这些信息都将添加到make文件中,如果我做一个构建,它调用make实用程序(或构建器)使用所有必要的命令行构建它。检查控制台视图输出可以看到它有什么作用
控制台视图输出
有了这个,我应该有一切做一个make文件项目。
创建Make File项目
我在Eclipse中创建一个新的make文件项目,菜单File> New Project:
新项目
与Eclipse中的许多事情一样,有多种方法来做事情。
如果我有现有的代码,我可以使用'Makefile项目与现有代码'。然后我可以给一个名字和现有的代码位置(文件夹)。然后,它将在该代码位置文件夹内创建项目,并将所有源文件添加到项目中:
新建带已有代码的Make文件项目
通用的方法是生成C或C ++项目:
新的C/C++项目
然后给项目一个名称,并选择一个空的make文件项目与支持的工具链:
创建空的Makefile项目
然后按“下一步”,然后根据所选的工具链进行剩余的对话框。这将创建一个如下的空项目:
空Makefile项目
应用文件
要编辑一些东西,添加一个新的源文件:
添加新的源文件
将其命名为main.c或任何您喜欢的:
新的main.c文件
然后添加一个main()例程与一些代码,例如
static int i;
void main(void) {
for(;;) {
i++;
}
/* do not leave main() */
}
Makefile文件
接下来,使用项目文件夹中的上下文菜单“ 新建”>“文件 ”:
新文件
在项目中创建一个名为“makefile”的文件:
创建Make File
这会添加一个空的make文件。
CMSIS,系统文件和启动
下一步很大程度上取决于所使用的设备。我在这个例子中使用恩智浦FRDM-KL25Z板。为了结构化,我创建了源的目录。特殊的“ debug ”文件夹将用于放置对象和可执行文件。
展开的项目结构
Make文件语法
下一步是实现make文件内容。一般的make文件如下所示:
all:hello.axf
清洁:
rm main.o hello.axf
hello.axf:main.o
gcc -g -o hello main.o
main.o:
gcc -c -g main.c
make文件中的每个条目都具有以下语法:
�请注意,每个命令前面都需要一个
有两个名为特殊目标所有的清洁。'clean'用于删除所有临时文件,'all'用于构建应用程序。
Makefile的内容
在makefile中,我定义了用于删除文件,编译器和链接器的变量:
############################
#删除文件的命令
RM:= rm -rf
############################
#编译器
CC:= arm-none-eabi-gcc
############################
#链接器
LL:= arm-none-eabi-gcc
然后我为最终的可执行文件定义一个宏:
############################
#二进制/可以构建
EXE:= \
./debug/MyMakeProject.axf
接下来是所有目标文件的列表。因为目标文件将被放置在'debug'文件夹中,这是名称的一部分:
############################
#目标文件列表
OBJS:= \
./debug/main.o \
./debug/startup_MKL25Z4.o \
./debug/system_MKL25Z4.o
接下来的事情真的很酷 如果main.c包含头文件main.h,我将不得不写一个规则
main.o:main.c main.h
$(CC)-c main.c -o main.o
但这是非常痛苦的:我必须为每个文件编写规则,并且需要跟踪头文件。相反,我让编译器稍后再创建依赖文件,扩展名为.d(用于依赖)。依赖文件main.d看起来像这样:
debug / main.o debug / main.d:source / main.c source / main.h
source/ main.h:
如果不是“干净”目标,我将文件作为附加规则文件包含在内:
############################
#包含生成的依赖文件(只有不干净的目标)
ifneq($(MAKECMDGOALS),clean)
ifneq($(strip $(C_DEPS)))
- 包含$(C_DEPS)
endif
endif
以下是我以后可以使用的编译器选项集:
############################
#编译器选项
CC_OPTIONS:= -c -std = gnu99 -O0 -g-功能部分-fdata-sections -fno-builtin -mcpu = cortex-m0plus -mthumb -DCPU_MKL25Z128VLK4 -D__USE_CMSIS -I“CMSIS”-I“source”
类似的,链接器的选项:
############################
#链接器选项
LL_OPTIONS:= -nostdlib -Xlinker -Map =“debug / MyMakeProject.map”-Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu = cortex-m0plus -mthumb -T linksfile.ld -o $(EXE )
接下来的目标是构建应用程序:
############################
#main(all)target
all:$(EXE)
@echo“***finished building***”
跟着目标做一个“干净”:
############################
#Clean target
clean:
-$(RM) $(EXECUTABLES) $(OBJS) $(EXE)
-$(RM) ./debug/*.map
-@echo ' '
以下是将应用程序与所有对象文件链接的规则:
############################
# Rule to link the executable
$(EXE): $(OBJS) $(USER_OBJS) linkerfile.ld
@echo 'Building target: $@'
@echo 'Invoking: Linker'
arm-none-eabi-gcc $(LL_OPTIONS) $(OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '
接下来,我指定构建对象文件的规则。我必须为每个要使用的子文件夹指定一个规则:
############################
# Rule to build the files in the source folder
./debug/%.o: ./source/%.c
@echo 'Building file: $<'
$(CC) $(CC_OPTIONS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '
############################
# Rule to build the files in the CMSIS folder
./debug/%.o: ./CMSIS/%.c
@echo 'Building file: $<'
$(CC) $(CC_OPTIONS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '
�选项-MMD -MP -MF“$(@:%。o =%。d)”
-MT“$(@:%。o =%。o)” 为每个编译的源文件生成依赖项.d文件。
制作目标
要构建项目,可以使用Eclipse中通常的“make / build”和“clean”菜单/命令。但还有一个很酷的方式:构建目标!
为此,打开构建目标视图(菜单Windows>显示视图>其他):
Make创建目标
在该视图中,选择项目,然后单击“新建目标”按钮:
新建目标
创建“干净”目标:
清洁目标
这将为项目添加一个“构建目标”组。使用上下文菜单为“全部”添加新目标:
创建新的目标
这样,我可以双击或使用上下文菜单在makefile中执行目标:
在Eclipse项目浏览器中创建目标
综述
在Eclipse中进行托管的制作和构建是一个很好的功能:它简单易用,并且可能是与IDE类似的98%的用例的正确的东西。但是如果我想使用Eclipse的普通make文件,这并不困难。使用提出的make文件模板,如果将新的源添加到项目中,我必须扩展文件列表。否则一切都得到照顾。编写文件需要学习阶段,但这可能是一个很好的投入。
接下来就可以快乐的Make中了。
相关链接
欢迎关注: