2015-06-27 64 views
0

我試圖將我以前創建的工作素描分解爲一個類和素描,並且遇到了一些麻煩。我正在擴展爲我正在開發的電路板設計的鍵盤類的功能,但編譯器不停地抱怨函數的多個定義。Arduino素描,多重定義誤差

這裏是我的草圖,我的.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. 

我做錯了什麼?

+0

它看起來像一些源文件重複,從而得到兩次編譯,例如'C:\ Users \ Dday \ Documents \ Arduino \ libraries \ MacroKeyboard/MacroKeyboard.cpp'和'C:\ Users \ Dday \ AppData \ Local \ Temp \ build538426719655717639.tmp/MacroKeyboard.cpp' –

+0

ah哎呀,當我試圖將它粘貼到我的庫文件夾中時,這是多個包含物。修復之後,我仍然遇到DigiKeyboard庫的問題:/編輯後發現新錯誤 – rsheldiii

+0

您必須添加所有相關代碼:在您發佈的代碼中沒有定義「usbFunctionSetup」,「DigiKeyboard」或「usbDescriptorHidReport」 。 –

回答

1

您使用的庫以奇怪的方式寫入。在文件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文件一個使用它。

+0

啊,這是有道理的。感謝你的幫助! – rsheldiii