长期不定时更新。
1.Multiple Defination问题
问题表现: 编译失败,提示函数多重定义却又不给出首次定义地点。
错误提示:1
2
3Error Compiling
Control.cpp:53: multiple definition of `TrueControl(double, double, double)'
Control.cpp.o:Control.cpp:53: first defined here
错误原因: 猜测编译器会忽略后缀为.cpp
文件中的#ifndef
?总之还是老老实实写一个.h
和一个.cpp
准没错。
解决办法:
- 将出错文件名后缀改为
.h
即可。(<-不规范) - 将函数定义单独放到
.h
文件中并使用#ifndef ... #define... #endif
(<-规范,未测试)
2.Uploading问题
问题表现: 成功编译,但上传失败。
错误提示:1
2
3
4
5
6Problem Uploading to board
avrdude: stk500_recv(): programmer is not responding
-- or
Clock not synchronize
错误原因: 常见于Arduino mini等没有直接USB接口的设备。原因为设备没有引出时钟线导致时钟不同步。
解决办法: 上传的一瞬间按下Reset
按键即可,也可以按住在上传的一瞬间松开。
3.Double Include问题
问题表现: 不定。
常见错误提示:1
2
3
4
5'XXX' was not declared in this scope
-- or
'XXX' does not name a type
错误原因: 你以为Include了,实际上并没有。
解决办法: 将所有需要的头文件在.ino
文件头再次#include
一次。当然不要忘记在头文件里加入#ifndef
。
解释&吐槽: 这个问题简直坑死爹了好吗!翻了好久才在Arduino论坛上找到。老外的解释是:
Arduino的编译器会将当前文件夹下用得到的文件拷贝到一个临时目录中进行编译(这也是为什么Arduino会要求将文件移到文件夹中),而编译器只会将.ino文件中包含的文件视作需要编译的文件(绕口令)。所以会无视包含中的包含。
也就是说,如果你有一个这样的包含关系:1
2
3
4
5| Arduino.ino
| library.h
| sublibrary.h
| math.h
|lib.h
而只在Arduino.h
中包含了library.h
,lib.h
那么在编译的时候编译器将不会拷贝sublibrary.h
和math.h
从而导致编译失败。
待续。