使用Eclipse进行Makefile项目

最近在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文件的好处是:

  • 比Eclipse .cproject文件和设置更容易在版本控制系统中存储和跟踪
  • 完全控制构建和制作过程
  • 作为构建过程的一部分,与其他步骤(例如使用版本控制系统或自动化测试系统)相比,这是微不足道的
  • 可以在IDE和外部使用相同的构建(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文件中的每个条目都具有以下语法:

<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中了。

 

相关链接

  • 本文在GitHub上的项目和文件:https://github.com/ErichStyger/mcuoneclipse/tree/master/Examples/MCUXpresso/FRDM-KL25Z/MyMakeProject
  • 制作文件教程:https://mcuoneclipse.com/2012/02/13/make-my-make-with-eclipse-and-mcu10/
  • GNU Make:https : //www.gnu.org/software/make/

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git commit 常用表情快速查询

git commit 的时候&#xff0c;添加表情符号可以更好的表明本次提交的性质&#xff0c;也更有趣。 常用表情符号如下&#xff1a; emoji emoji代码 commit说明 &#x1f3a8; (调色板) :art: 改进代码结构/代码格式 ⚡️ (闪电) :zap: 提升性能 &#x1f40e; (赛马)…

C语言学习及应用笔记之一:C运算符优先级及使用问题

C语言中的运算符绝对是C语言学习和使用的一个难点&#xff0c;因为在2011版的标准中&#xff0c;C语言的运算符的数量超过40个&#xff0c;甚至比关键字的数量还要多。这些运算符有单目运算符、双目运算符以及三目运算符&#xff0c;又涉及到左结合和右结合的问题&#xff0c;真…

Docker用法整理

Docker教程推荐 两个不错的参考资料&#xff1a; https://yeasy.gitbooks.io/docker_practice/content/introduction/ https://www.cnblogs.com/bethal/p/5942369.html 镜像&#xff1a; 查看镜像 docker images ls 删除镜像 docker image rm <image id> 拉取镜像 …

使用FreeRTOS进行性能和运行时分析

在MCU on Eclipse网站上看到Erich Styger在2月25日发的博文&#xff0c;一篇关于使用FreeRTOS进行性能和运行分析的文章&#xff0c;本人觉得很有启发&#xff0c;特将其翻译过来以备参考。当然限于个人水平&#xff0c;有描述不当之处恳请指正。原文网址&#xff1a;https://m…

生成微信公众号对应二维码的两种简单方法

方法1 在浏览器中打开下面的链接 https://open.weixin.qq.com/qr/code?usernameName 其中Name替换为对应公众号的微信号 例如&#xff0c;我们打算生成公众号 AI算法联盟 的二维码 只需首先关注这个公众号 在其详细信息中&#xff0c;查找到微信号信息&#xff1a;AIReport…

在Amazon FreeRTOS V10中使用运行时统计信息

在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文&#xff0c;一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章&#xff0c;本人觉得很有启发&#xff0c;特将其翻译过来以备参考。原文网址&#xff1a;https://mcuoneclipse.com/2018/08/02/tutorial-using-…

github无法加载图片的解决办法

最近发现我的github上面项目README里面的图片全裂了&#xff0c;一直以为是github最近服务器不稳定。今天通过简单的查询&#xff0c;发现原来这个问题可以解决&#xff0c;但是不能永久有效&#xff0c;之后还会用到&#xff0c;因此记录在这里&#xff0c; 也分享给大家。 解…

leetcode 1.两数之和

题目 链接&#xff1a;https://leetcode-cn.com/problems/two-sum 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复…

C语言学习及应用笔记之二:C语言static关键字及其使用

C语言有很多关键字&#xff0c;大多关键字使用起来是很明确的&#xff0c;但有一些关键字却要相对复杂一些。我们这里要说明的static关键字就是如此&#xff0c;它的功能很强大&#xff0c;相应的使用也就更复杂。 一般来说static关键字的常见用法有三种&#xff1a;一是用作局…

μCUnit,微控制器的单元测试框架

在MCU on Eclipse网站上看到Erich Styger在8月26日发布的博文&#xff0c;一篇关于微控制器单元测试的文章&#xff0c;有很高的参考价值&#xff0c;特将其翻译过来以备学习。原文网址&#xff1a;https://mcuoneclipse.com/2018/08/26/tutorial-%CE%BCcunit-a-unit-test-fram…

leetcode No.15-16 三数之和相关问题

leetcode 15. 三数之和 题目 链接&#xff1a;https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组…

PID控制器开发笔记之十一:专家PID控制器的实现

前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法&#xff0c;基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制&#xff0c;智能PID控制不同于常规意义下的智能控制&#xff0c;是智能算法与PID控制算法的结合&#xff0c…

leetcode No.123 买卖股票的最佳时机 III

题目 链接&#xff1a;https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多…

Modbus协议栈开发笔记之七:Modbus ASCII Slave开发

与Modbus RTU在串行链路上分为Slave和Master一样&#xff0c;Modbus ASCII也分为Slave和Master&#xff0c;这一节我们就来开发Slave。对于Modbus ASCII从站来说&#xff0c;需要实现的功能其实与Modbus RTU的Slave是一样的。其操作过程也是一样的。首先接收到主站的访问命令&a…

leetcode No.21 合并两个有序链表

题目 链接&#xff1a;https://leetcode-cn.com/problems/merge-two-sorted-lists 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1-&…

Modbus协议栈开发笔记之八:Modbus ASCII Master开发

这一节我们来封装Modbus ASCII Master应用&#xff0c;Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用&#xff0c;而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数&#xff0c;以便在开发具体应用时调用。 对于ASCII主站我们主…

leetcode No.83 删除排序链表中的重复元素

题目 链接&#xff1a;https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list 给定一个排序链表&#xff0c;删除所有重复的元素&#xff0c;使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&…

在Eclipse中使用Git

本文原文出自MCU on Eclipse网站&#xff0c;作者为Erich Styger&#xff0c;原文网址&#xff1a;https://mcuoneclipse.com/2018/09/30/tutorial-git-with-eclipse/。本人翻译了此篇文章&#xff0c;有些短语难以找到准确表达的中文词语&#xff0c;所以保持了原文。限于个人…

leetcode No.141 环形链表

题目 链接&#xff1a;https://leetcode-cn.com/problems/linked-list-cycle 给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&…

C语言学习及应用笔记之三:C语言const关键字及其使用

在C语言程序中&#xff0c;const关键字也是经常会用到的一个关键字&#xff0c;那么使用const关键字的目的是什么呢&#xff1f;事实上&#xff0c;在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。 事实上&#xff0c;无论我们是使用const关键字声明…