emacs 的 arduino mode 的一个问题

我在 freebsd 下使用。arduino IDE 下正常,emacs arduino-mode 就有以下这个问题:

#include </usr/local/arduino/libraries/Wire/Wire.h>

#include语句要写绝对路径,不然就报错。`

bsd.arduino.mk文件中已经有

 PREFIX?=                /usr/local
 ARDUINO_PREFIX?=        ${PREFIX} 
 ARDUINO_DIR?=           ${ARDUINO_PREFIX}/arduino
 ARDUINO_LIBRARIES_DIR?= ${ARDUINO_DIR}/libraries

sketch目录下的Makefile文件内容:

 TARGET= light6
 ARDUINO_BOARD= uno
 ARDUINO_MK_DIR= /usr/local/arduino-bsd-mk
 MAKEOBJDIRPREFIX= /usr/obj
 AVRDUDE_PORT= /dev/cuaU0
 .include "${ARDUINO_MK_DIR}/bsd.arduino.mk"

为什么第一个想法是到社区来发帖子,而不是去GitHub上给项目提issue?

1 个赞

github 看不懂。stardiviner 也有 arduino-mode 项目,能帮我吗?

这个项目就是我在维护。。。。。 你不到github上面提,这里用arduino-mode的人又少。 万一我不是在这个社区里。不就没人回复你。 你只是运气好,恰好我是维护者。

这个是arduino命令行工具的问题。你要自己指定include目录。 arduino-mode 里面的 flycheck-arduino 其实代码很简单。就是调用命令。

(flycheck-define-checker arduino
  ;; https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc
  "Arduino checker using Arduino IDE. (This requires higher than version 1.5+)"
  ;; source, source-inplace, source-original
  :command ("arduino" "--verify" source-original)
  :error-patterns
  (;; I don't make sure about this warning... How to emit a warning?
   (warning line-start (file-name) ":" line ":" column ": warning: " (message) line-end)
   (error   line-start (file-name) ":" line ":" column ": " (0+ "fatal ") "error: " (message) line-end))
  :modes (arduino-mode))

验证一个源代码文件比如标准例子 Blink.ino

arduino --verify Blink.ino
Picked up JAVA_TOOL_OPTIONS:
Loading configuration...
Initializing packages...
Preparing boards...
Verifying...
Blink:25:10: fatal error: ArduinoCloudThing/src/ArduinoCloudThing.h: No such file or directory
   25 | #include <ArduinoCloudThing/src/ArduinoCloudThing.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1

我测试了一下,Emacs里面flycheck竟然是正常的,没报错。难道我arduino做了什么设置么?太久了忘记了。

.mk 文件是啥?第一次见。

问题解法原来是 Makefile 少了一行,比如源文件中有 include <Wire.h> 句子,则 Makefile 文件中要有 ARDUINO_LIBS= Wire

ARDUINO_LIBS= Wire

有多个LIBS时使用空格分隔。同时 /usr/local/arduino/libraries/XXX 要更名。

如我下载了一个“USB_Host_Shield_Library_2_0-1.5.0”,里面有个 PS4USB.h 文件,当我代码里使用了 #include <PS4USB.h> 时,需要把 /usr/local/arduino/libraries/USB_Host_Shield_Library_2_0-1.5.0 目录更名为 /usr/local/arduino/libraries/PS4USB