如何正确粘贴 Arduino IDE 中 #include 的代码?
How do you properly paste in code from an #include in Arduino IDE?
我有一个控制 RGB LED 灯条的简短程序。因为这个库太小了,我想把它放到一个文件中,这样就可以简单地 copied/pasted 到一个项目中。
除了一个单独的包含,它在直接复制到代码中时不起作用,一切正常。
我尝试直接复制并粘贴来自 #include "cRGB.h"
的代码,这恰好是一个简单的结构。定义 (struct cRGB { uint8_t g; uint8_t r; uint8_t b; };
).
查看下面的完整代码。
据我了解,#include
只是 'copies' 将文件中的代码直接插入到文件中。如果是这样,为什么这段代码编译失败?
#include "cRGB.h"
class WS2812 {
public:
WS2812(uint16_t num_led);
~WS2812();
void setOutput(uint8_t pin);
cRGB get_crgb_at(uint16_t index);
uint8_t set_crgb_at(uint16_t index, cRGB px_value);
uint8_t set_subpixel_at(uint16_t index, uint8_t offset, uint8_t px_value);
void sync();
private:
uint16_t count_led;
uint8_t *pixels;
void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask,uint8_t *port, uint8_t *portreg);
const volatile uint8_t *ws2812_port;
volatile uint8_t *ws2812_port_reg;
uint8_t pinMask;
};
WS2812 LED(4); // 1 LED
cRGB value1;
cRGB value2;
cRGB value3;
cRGB value4;
void setup() {
LED.setOutput(3); // Digital Pin 9
}
void loop() {
value1.b = 0; value1.g = 255; value1.r = 255; // RGB Value
LED.set_crgb_at(0, value1); // Set value at LED found at index 0
LED.sync(); // Sends the value to the LED
delay(500); // Wait 500 ms
}
错误如下:
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `setup':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:39: undefined reference to `WS2812::setOutput(unsigned char)'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `loop':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:44: undefined reference to `WS2812::set_crgb_at(unsigned int, cRGB)'
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:45: undefined reference to `WS2812::sync()'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `_GLOBAL__sub_I_LED':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:31: undefined reference to `WS2812::WS2812(unsigned int)'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `_GLOBAL__sub_D_LED':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:31: undefined reference to `WS2812::~WS2812()'
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino Uno.
代码在使用 #include
而不是直接在草图中编写时编译和运行得很好。
好像有很多function prototypes没有定义
例如
void setOutput(uint8_t pin);
这里setOutput
被声明为WS2812的一个方法,但是这个函数没有在任何地方定义,好像你缺少指定所有这些函数的.cpp
文件,你可以复制它们在文件末尾,它应该 运行 可以。
我有一个控制 RGB LED 灯条的简短程序。因为这个库太小了,我想把它放到一个文件中,这样就可以简单地 copied/pasted 到一个项目中。
除了一个单独的包含,它在直接复制到代码中时不起作用,一切正常。
我尝试直接复制并粘贴来自 #include "cRGB.h"
的代码,这恰好是一个简单的结构。定义 (struct cRGB { uint8_t g; uint8_t r; uint8_t b; };
).
查看下面的完整代码。
据我了解,#include
只是 'copies' 将文件中的代码直接插入到文件中。如果是这样,为什么这段代码编译失败?
#include "cRGB.h"
class WS2812 {
public:
WS2812(uint16_t num_led);
~WS2812();
void setOutput(uint8_t pin);
cRGB get_crgb_at(uint16_t index);
uint8_t set_crgb_at(uint16_t index, cRGB px_value);
uint8_t set_subpixel_at(uint16_t index, uint8_t offset, uint8_t px_value);
void sync();
private:
uint16_t count_led;
uint8_t *pixels;
void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask,uint8_t *port, uint8_t *portreg);
const volatile uint8_t *ws2812_port;
volatile uint8_t *ws2812_port_reg;
uint8_t pinMask;
};
WS2812 LED(4); // 1 LED
cRGB value1;
cRGB value2;
cRGB value3;
cRGB value4;
void setup() {
LED.setOutput(3); // Digital Pin 9
}
void loop() {
value1.b = 0; value1.g = 255; value1.r = 255; // RGB Value
LED.set_crgb_at(0, value1); // Set value at LED found at index 0
LED.sync(); // Sends the value to the LED
delay(500); // Wait 500 ms
}
错误如下:
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `setup':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:39: undefined reference to `WS2812::setOutput(unsigned char)'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `loop':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:44: undefined reference to `WS2812::set_crgb_at(unsigned int, cRGB)'
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:45: undefined reference to `WS2812::sync()'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `_GLOBAL__sub_I_LED':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:31: undefined reference to `WS2812::WS2812(unsigned int)'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `_GLOBAL__sub_D_LED':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:31: undefined reference to `WS2812::~WS2812()'
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino Uno.
代码在使用 #include
而不是直接在草图中编写时编译和运行得很好。
好像有很多function prototypes没有定义
例如
void setOutput(uint8_t pin);
这里setOutput
被声明为WS2812的一个方法,但是这个函数没有在任何地方定义,好像你缺少指定所有这些函数的.cpp
文件,你可以复制它们在文件末尾,它应该 运行 可以。