我有一个现有的AVR程序使用main
函数,而不是setup
和loop
。这似乎是需要的,因为它使用计时器,当我用setup
和loop
手动替换它时不起作用。
这工作正常,但我想从库中包含一些代码,现在编译器抱怨main
的多个定义。这很奇怪,因为没有真正包括在内,我宣布我自己的main
(所以没有偷偷摸摸的默认main
函数),我已经孤立到以下情况:
int main()
{
}
// Foo.h
class Foo
{
void bar();
};
// Foo.cpp
void Foo::bar()
{
/* remove static here */
static String foo;
}
一旦我在String
方法中声明foo
bar
,编译器开始抱怨。但只有当它被宣布为static
。否则代码编译。
我不是一个cpp
家伙,无法弄清楚为什么在方法中声明一个静态变量会触发这个。
String
(来自WString.h
?),其他数据类型(我可以找到)不会发生这种情况。WString
没什么变化。我的理解(忽略模板类)是有一个foo
的副本;所以我可以全局声明它或作为类的成员变量(后者在技术上是不同的,但只有这个类的单个实例)。
我得到的错误:
// previous stages succeed ... Linking everything together... "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc" -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "/path/to/build/static_in_cpp_method.ino.elf" "/path/to/build/sketch/static_in_cpp_method.ino.cpp.o" "/path/to/build/../arduino_cache_993247/core/core_arduino_avr_pro_cpu_16MHzatmega328_51f02b7210b938436b779d1c032618e1.a" "-L/path/to/build" -lm main.cpp.o (symbol from plugin): In function `atexit': (.text+0x0): multiple definition of `main' /path/to/build/sketch/static_in_cpp_method.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here collect2: error: ld returned 1 exit status exit status 1 Error compiling for board Arduino Pro or Pro Mini.
main()
函数。void loop()
和void setup()
函数main()
函数中的代码应分为两部分:
初始化代码应放入setup()
,
和“主循环”代码 - 进入loop()
函数。并且您的代码可以使用或不使用static
关键字进行编译。