如何编写与makefile兼容的草图?


9

我想写草图,以便可以使用Arduino IDE或可以选择使用GCC和makefile来构建/上传它们。

我知道在顶部包括函数声明,但是为了使我的草图被编译器视为有效的C ++,还有其他事情要做吗?

更新1

了解Arduino IDE对.ino和.pde文件的操作很好,但是与我的问题无关,因此这不是重复的。我想知道的是“我如何编写程序,以使Arduino IDE g ++ 都认为它是有效的。

此处提供的Official(?)Makefile 解释了使用Makefile 代替 IDE时的操作:

# The Arduino environment does preliminary processing on a sketch before
# compiling it.  If you're using this makefile instead, you'll need to do
# a few things differently:
#
#   - Give your program's file a .cpp extension (e.g. foo.cpp).
#
#   - Put this line at top of your code: #include <WProgram.h>
#
#   - Write prototypes for all your functions (or define them before you
#     call them).  A prototype declares the types of parameters a
#     function will take and what type of value it will return.  This
#     means that you can have a call to a function before the definition
#     of the function.  A function prototype looks like the first line of
#     the function, with a semi-colon at the end.  For example:
#     int digitalRead(int pin);

...但是这并不能解释如何同时使用IDE和Makefile。

更新2

我最近发现PlatformIO不能直接回答这个问题,但是可以自动化很多过程(为您生成Scons文件),到目前为止,我更喜欢Arduino IDE和source + makefile方法的工作流程。以及作者的良好支持。


因此问题超出了我的理解范围,但是您需要考虑的一些事情是Arduino.h文件的包含。合并引导程序;还有其他 我将关注这个问题:)
Madivad 2014年

我建议您看一下Arduino-CMake(github.com/queezythegreat/arduino-cmake)。
jfpoilpret 2014年


1
除非您愿意做出很多牺牲,否则您不能编写直接被IDE和G ++视为有效的“程序”。与伊野打交道。
伊格纳西奥·巴斯克斯

1
发现我的答案在这里,在附加生成文件的意见。
hoosierEE 2014年

Answers:


1

我认为gcc / g ++是专门指avr-gcc / avr-g ++。您的arduino代码可能不会被视为有效的C / C ++代码,因为gcc会尝试使用PC作为目标系统进行编译。“ WProgram.h”中的许多宏将引用目标系统上无法访问的内存。

如果提供了头文件“ WProgram.h”,并使用上面的Arduino Makefile(使用avr-g ++而非g ++)构建代码,则cpp文件应正确编译并链接。同样,您将能够在IDE中打开Arduino代码并在那里验证您的代码。IDE将为您放入“ WProgram.h”文件,因此从技术上讲它将被包含两次。但是,包含保护将防止任何重复的代码被编译。


1

通常,您需要声明setup()loop()函数,它们只是IDE的包装:

void setup() {}
void loop() {}

int main() {
  setup();
  while (1)
    loop();

  return 0; // never reached
}

这在IDE和命令行中均有效。在IDE中指定Board和SerialPort时,还需要在Makefile中同时指定两者。因此,您将获得两种配置。

许多人离开IDE是因为他们更喜欢使用不同的编辑器或通过设置编译器和链接器开关来拥有更多配置选项。

要使其变得非常简单,您可以使用Arduino Makefile。今天主演了347。

这是一个示例Makefile:

# try: make help
#
include /usr/share/arduino/Arduino.mk
ARDUINO_DIR = /usr/share/arduino
# list boards with: make show_boards
BOARD_TAG = promicro16
ARDUINO_LIBS = EEPROM 
# MONITOR_CMD = picocom -b 9600
MONITOR_CMD = moni -config ACM0-9600.cfg
ARDUINO_PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Leonardo-if00
# ARDUINO_PORT = /dev/ttyACM0
# ARDUINO_PORT = /dev/ttyUSB0
OPTIMIZATION_FLAGS = -Os -fexpensive-optimizations -fstrength-reduce
#

'* .ino'文件不需要更改,并且Makefile文件将放置在同一目录中。

同时,我更喜欢这种Makefile方式,但是我仍然将IDE用于小型项目。


1

我想知道的是“我如何编写程序,以便Arduino IDE和g ++都认为它是有效的。

请参阅:如何避免IDE草图文件预处理的怪癖

暂时忽略Makefile的外观,如上面链接所述,对该问题的简单答案是将所有内容放入IDE中的.cpp和.h选项卡,并保留主“ sketch”(。ino)。文件)为空白。那仍然可以在IDE下编译,因此也将是普通的C ++。

确保使用以下命令启动.cpp文件:

#include <Arduino.h>

如果使用库(例如SPI),则必须将它们包括在主草图文件中,这会触发IDE将它们复制到临时项目构建文件中。Makefile不会在乎这一点,因为您将确保Makefile包含所有必需的库文件。

也可以在这里查看我的答案:类和对象:使用它们实际上需要多少个文件类型?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.