簡體   English   中英

Arduino草圖,多定義錯誤

[英]Arduino sketch, multiple definition error

我試圖將以前創建的草圖分解為類和草圖,但遇到了一些麻煩。 我正在擴展為正在使用的主板設計的鍵盤類的功能,但是編譯器一直抱怨功能的多種定義。

這是我的草圖,.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文件中來使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM