gpt4 book ai didi

c++ - Arduino草图,多重定义错误

转载 作者:行者123 更新时间:2023-11-28 06:11:55 24 4
gpt4 key购买 nike

我试图将我之前创建的工作草图分解为类和草图,但我遇到了一些麻烦。我正在扩展为我正在处理的电路板设计的键盘类的功能,但编译器一直提示函数的多个定义。

这是我的草图、我的 .h 和我的 .cpp:

素描

#include <DigiKeyboard.h>
#include "MacroKeyboard.h"

//constants
#define LED 1
#define SWITCH 0


//configuration
#define PAUSE_ON_ENTER true

const char command[] PROGMEM = "test string";
MacroKeyboard kb(command, SWITCH);

void setup() {
//tie switch to high
pinMode(SWITCH, OUTPUT);
digitalWrite(SWITCH, HIGH);

// set pins to correct uh whatever
pinMode(LED, OUTPUT);
pinMode(SWITCH, INPUT);

}

void loop() {
DigiKeyboard.update();
kb.update();
}

.h:

#ifndef MacroKeyboard_h
#define MacroKeyboard_h

#include "Arduino.h"

#define ON LOW
#define OFF HIGH
#define SCANCODE_DIFF 8

class MacroKeyboard {
const char* command;
int pin;
bool isPressed = false;

public:
MacroKeyboard(const char*, int);
void parseLetter(int);
void update();
};
#endif

.cpp:

#include <DigiKeyboard.h>
#include "MacroKeyboard.h"

MacroKeyboard::MacroKeyboard(const char* macro_position, int pin_number){
command = macro_position;
pin = pin_number;
}

void MacroKeyboard::parseLetter(int letter){
unsigned int scancode = pgm_read_byte_near(ascii_to_scan_code_table + letter - SCANCODE_DIFF);
unsigned int keycode = scancode & ((1 << 7) - 1); // masking off shift bit

unsigned int mods = 0;
unsigned int shift = (scancode & (1 << 7)) >> 7;
mods |= (shift == 1) ? MOD_SHIFT_LEFT : 0;

DigiKeyboard.sendKeyStroke(keycode, mods);
}

void MacroKeyboard::update(){
if(digitalRead(pin) == ON && !isPressed){
isPressed = true;
for (int i = 0; i < strlen(command); i++){
char letter = pgm_read_byte_near(command + i);
parseLetter(letter);
}
}

if (digitalRead(pin) == OFF && isPressed){
isPressed = false; // debounce
}
}

我得到的错误是这样的:

    MacroKeyboard\MacroKeyboard.cpp.o: In function `usbFunctionSetup':
C:\Program Files (x86)\Digistump_Arduino\hardware\digistump\avr\libraries\DigisparkKeyboard/DigiKeyboard.h:216: multiple definition of `usbFunctionSetup'
MacroKeyboardTest.cpp.o:C:\Program Files (x86)\Digistump_Arduino\hardware\digistump\avr\libraries\DigisparkKeyboard/DigiKeyboard.h:216: first defined here
MacroKeyboard\MacroKeyboard.cpp.o: In function `MacroKeyboard::MacroKeyboard(char const*, int)':
C:\Program Files (x86)\Digistump_Arduino\hardware\digistump\avr\libraries\DigisparkKeyboard/DigiKeyboard.h:170: multiple definition of `DigiKeyboard'
MacroKeyboardTest.cpp.o:C:\Program Files (x86)\Digistump_Arduino\hardware\digistump\avr\libraries\DigisparkKeyboard/DigiKeyboard.h:199: first defined here
MacroKeyboard\MacroKeyboard.cpp.o:(.progmem.data.usbDescriptorHidReport+0x0): multiple definition of `usbDescriptorHidReport'
MacroKeyboardTest.cpp.o:(.progmem.data.usbDescriptorHidReport+0x0): first defined here
collect2: error: ld returned 1 exit status
Error compiling.

我做错了什么?

最佳答案

您使用的库以一种奇怪的方式编写。在文件 DigiKeyboard.h 中有这样的定义(评论我的):

// Declares a global variable.
// If you include this file in more than one cpp file it will cause linker error.
DigiKeyboardDevice DigiKeyboard = DigiKeyboardDevice();

// Defines a non-inline function
// Again, multiple definitions error if the file is included in several source files.
uchar usbFunctionSetup(uchar data[8]) {
// code
}

所以你必须通过将这个 .h 文件包含到一个 .cpp 文件中来使用它。

关于c++ - Arduino草图,多重定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31094177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com