最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile建立项目的文章,文章讲解清晰明了很是不错,因此呢没人将其翻译过来供各位同仁参考。固然限于我的水平,有不当之处恳请指正。原文网址:https://mcuoneclipse.com/2017/07/22/tutorial-makefile-projects-with-eclipse/git
像Eclipse这样的IDE的好处是它使得处理项目的工做变得很是容易。由于它不但能够生成文件,并且能够获取并自动地管理Makefile文件。但有时这可能不是我想要的,由于我须要更大的灵活性和控制,或者我想要为个人持续集成和自动化测试系统使用相同的制做文件。在这种状况下,就须要本身编写Makefile文件。github
有一件事不排除其余内容:本文介绍如何使用Eclipse中的makefiles与Eclipse中托管构建系统类似的温馨度,可是具备无限制的make files:浏览器
概要eclipse
Eclipse附带一个内置的构建系统(managed make):我能够配置编译器连接器设置,Eclipse会处理其他的事情。在本教程中,我将介绍如何使用Eclipse手动建立和使用精心制做的make files。所推荐的make files和模板能够方便地使用make来控制构建系统。所提出的方法要求添加到项目中的每一个新的源文件须要扩展make文件,而是对全部包含的头文件的自动生成依赖文件的make文件进行扩展。函数
使用make文件的好处是:工具
make文件方法须要了解构建过程,为此,了解什么与管理make一块儿使用是有帮助的,因此我能够将其用做基础或灵感。学习
前提条件测试
要在Eclipse中使用make文件,我须要如下内容:网站
获取必要的文件和选项的一个好方法是查看一个一般使用“manged make”的示例项目。ui
💡我把这个项目的来源放在了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文件中的每一个条目都具备如下语法:
<target>:<依赖关系列表>
<tab>要执行的命令
💡请注意,每一个命令前面都须要一个<TAB>字符!
有两个名为特殊目标全部的清洁。'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中了。
相关连接
欢迎关注: