Arduino IDE:为什么草图无法编译(以及如何避免这种情况)
由于我正在Arduino IDE中进行大量开发,因此这个问题确实让我感到担忧。为什么在一个开发环境版本中编写的草图拒绝在相邻版本中进行编译?Arduino Mega Server用户用同样的问题使我不知所措。为什么AMC在1.6.5中进行编译,而拒绝在1.6.4、1.6.7和1.6.8中进行编译?最近,在将Arduino Mega Server移植到新的Genuino 101控制器的过程中,我能够解决这个巨大的谜团。在本文中,我将与您分享这一神圣的知识,之后您的草图将始终可以成功编译。所以...事物的逻辑
从逻辑上讲,在任何版本的开发环境(例如1.6.5)中成功编译的代码都必须在IDE的相邻版本中进行编译,因为这些版本仅在第三个字符上有所不同,并且几乎相同,但进行了少量修改。但这不会发生。怎么了家用厨房
要了解这一点,您需要了解Arduino IDE开发环境的版本是如何形成的,以及用户如何使用这些开发环境。让我们从用户开始。从形象上讲,它们中的大多数会编译20条线中的原始项目,并且这些项目没有问题。这些项目可以在任何版本的IDE中成功编译,因为它们仅使用标准库函数调用,而不会修改库本身。但是,在Arduino上开发的项目已不再适合“ 20行”,并且不可避免地使用了来自库的较少通用功能(它们更容易因版本而异),并且不可避免地需要根据自己的项目特定需求来修改库。并且,一旦您修改了系统库,您就成为人质,并被迫将其随版本“拖动”。现在让我们看看Arduino IDE的版本是如何形成的。他们是由发行团队任意组建的(我怀疑最后是一个特定的程序员,有些是马里奥)。分发工具包中将包含特定版本的库以及该版本“ Mario”的良心仍然以何种形式(具有哪些修改形式)包含在分发工具包中。现在注意,这非常重要!发行团队只有一个目标-一种版本的发行必须在彼此内部达成一致并保持一致。他们的任务是确保所有标准示例都能正常工作。仅此而已!版本之间的兼容性任务根本不构成。而且由于99%的用户以“ 20行”的形式编译项目,因此这种方法在实践中可以完美地“滚动”。而任何严重的项目都没有编译的事实就是这些项目的问题。感谢上帝,现在已经清楚了问题发生的机制,并且现在已经知道如何处理该问题。具体例子
让我们回顾一下AMS向Genuino 101的移植(它从1.6.7版及更高版本开始工作)。在这里,Arduino团队为我们盘点了另一个笑话(做得好,他们不允许我们放松)。尝试为新控制器编译项目会导致许多编译器错误。对消息的分析表明,编译器非常不喜欢我们的以太网库。她为什么不请编译器?我们开始理解。我们的库:版本= 1.0.4(不喜欢编译器)IDE 1.6.7中的库:版本= 1.0.4(例如编译器)但是。我们的库:31个文件(不喜欢编译器)IDE 1.6.7中的库:31个文件(如编译器)但是。我们的图书馆:123 KB(不喜欢的编译器)图书馆从IDE 1.6.7:123 KB(如编译器),但是。换句话说,马里奥“卡死”了一个IDE 1.6.7以太网库,该库具有与IDE 1.6.5中相同的版本号,相同数量的文件和相同大小,但内容不同且忘记了警告我们。这是最“不同的内容”,例如蜘蛛坚持其IDE和其他较低级别的库(也在1.6.7中进行了修改)。太好了,马里奥!使用这种方法,除了标准示例和20行草图外,什么都不会编译。实用解决方案(Arduino的难题)
现在,为什么不能在不同版本的Arduino IDE中编译项目的机制已经非常清楚,因此解决此问题的方法也已经非常清楚。在这种特殊情况下,解决方案包括三个部分。- 第一部分 寻找一个工作图书馆。还记得发行团队创建一致版本的IDE的任务吗?因此,某个地方必须有我们需要的库的有效版本。
- 第二部分 将工作中的以太网库从顽皮的小Mario转移到她在Arduino Mega Server项目中的位置。这里没有什么复杂的-只需将其复制到我们的库中,在IDE 1.6.7以太网中不起作用。
- 第三部分。修改了IDE 1.6.7以太网中已移植且可以正常工作的库的Arduino Mega Server项目。
对项目的所有非编译库都需要做同样的事情(也就是说,从IDE中找到该库的工作版本,并将其转移到项目中的位置,并在必要时进行修改)。但是在这种情况下,我们很幸运,所有其他库都运行良好(因为Mario没有时间静静地修改它们,尽管他可以并且肯定会在新版本的IDE中做到这一点,但是我们已经知道如何处理这个问题)。结论
这是在复杂项目的Arduino IDE中成功工作的全部秘密。现在,您可以全副武装,并且可以在任何版本的Arduino IDE 上进行项目工作都不会困难。Source: https://habr.com/ru/post/zh-CN392931/
All Articles