Unable to compile and link a Virtual Keyboard

I have tried a couple different sketches without success. My progress so far. I started out attempting to compile "VirtualUsbKeyboard.pde" from practicalarduino.com (GitHub - practicalarduino/VirtualUsbKeyboard: Use an Arduino to send HID (Human Interface Device) events to a host computer as if it were a keyboard) just as a starting point.

/**
 * VirtualUsbKeyboard
 *
 * Enumerates itself as a HID (Human Interface Device) to a host
 * computer using a USB shield. The Arduino then appears to the host to
 * be a USB keyboard and keypress events can be sent on demand.
 *
 * This example watches the state of 6 push buttons and when a button
 * is pressed it sends a matching keypress event to the host.
 *
 * Copyright 2009 Jonathan Oxer <jon@oxer.com.au>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version. http://www.gnu.org/licenses/
 *
 * www.practicalarduino.com/projects/easy/virtual-usb-keyboard
 */

// Requires the use of the "UsbKeyboard" library available from
//   http://code.rancidbacon.com/ProjectLogArduinoUSB
#include "UsbKeyboard.h"

// Define the inputs to use for buttons
#define BUTTON_A 6
#define BUTTON_B 7
#define BUTTON_C 8
#define BUTTON_D 9
#define BUTTON_MSG 10
#define BUTTON_ENTER 11

// Use the on-board LED as an activity display
int ledPin = 13;

/**
 * Configure button inputs and set up the USB connection to the host
 */
void setup()
{
  // Set up the activity display LED
  pinMode (ledPin, OUTPUT);
  digitalWrite (ledPin, HIGH);

  // Set the button pins to inputs
  pinMode (BUTTON_A, INPUT);
  pinMode (BUTTON_B, INPUT);
  pinMode (BUTTON_C, INPUT);
  pinMode (BUTTON_D, INPUT);
  pinMode (BUTTON_MSG, INPUT);
  pinMode (BUTTON_ENTER, INPUT);

  // Enable the CPU's internal 20k pull-up resistors on the button
  // inputs so they default to a "high" state
  digitalWrite (BUTTON_A, HIGH);
  digitalWrite (BUTTON_B, HIGH);
  digitalWrite (BUTTON_C, HIGH);
  digitalWrite (BUTTON_D, HIGH);
  digitalWrite (BUTTON_MSG, HIGH);
  digitalWrite (BUTTON_ENTER, HIGH); 

  // Disable timer0 since it can mess with the USB timing. Note that
  // this means some functions such as delay() will no longer work.
  TIMSK0&=!(1<<TOIE0);

  // Clear interrupts while performing time-critical operations
  cli();

  // Force re-enumeration so the host will detect us
  usbDeviceDisconnect();
  delayMs(250);
  usbDeviceConnect();

  // Set interrupts again
  sei();
}


/**
 * Main program loop. Scan for keypresses and send a matching keypress
 * event to the host
 * FIXME: currently repeats as fast as it can. Add transition detection
 */
void loop()
{
  UsbKeyboard.update();

  if (digitalRead(BUTTON_A) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_A);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_B) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_B);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_C) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_C);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_D) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_D);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_MSG) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_H, MOD_SHIFT_LEFT);
    UsbKeyboard.sendKeyStroke(KEY_E);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_O);
    UsbKeyboard.sendKeyStroke(KEY_SPACE);
    UsbKeyboard.sendKeyStroke(KEY_W, MOD_SHIFT_LEFT);
    UsbKeyboard.sendKeyStroke(KEY_O);
    UsbKeyboard.sendKeyStroke(KEY_R);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_D);
    UsbKeyboard.sendKeyStroke(KEY_ENTER);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }

  if (digitalRead(BUTTON_ENTER) == LOW) {
    UsbKeyboard.sendKeyStroke(KEY_ENTER);
    digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
  }
}


/**
 * Define our own delay function so that we don't have to rely on
 * operation of timer0, the interrupt used by the internal delay()
 */
void delayMs(unsigned int ms)
{
  for (int i = 0; i < ms; i++) {
    delayMicroseconds(1000);
  }
}

Of course it failed. It says it need a library from (http://code.rancidbacon.com/ProjectLogArduinoUSB). So I downloaded it and copied the library "UsbKeyboard" into my Arduino IDE libraries. Attempted to compile again and it failed again.

Well in the UsbKeyboard library there is a text file "ArduinoNotes.txt" which says among other things:

At present the IDE won't compile our library so it needs to be pre-compiled with:
avr-g++ -Wall -Os -I. -DF_CPU=16000000 -mmcu=atmega168 -c usbdrvasm.S -c usbdrv.c

So from the command line in the library I run:

C:\Arduino\arduino-1.0.1\libraries\UsbKeyboard>C:\Arduino\arduino-1.0.1\hardware\tools\avr\bin\avr-g++.exe -Wall -Os -I. -DF_CPU=16000000 -mmcu=atmega328p -c usbdrvasm.S -c usbdrv.c
usbdrv.c:70: warning: only initialized variables can be placed into program memory area
usbdrv.c:80: warning: only initialized variables can be placed into program memory area
usbdrv.c:89: warning: only initialized variables can be placed into program memory area
usbdrv.c:111: warning: only initialized variables can be placed into program memory area
usbdrv.c:142: warning: only initialized variables can be placed into program memory area

Again I try and fail to compile and link the sketch. I get the following errors:

VirtualUsbKeyboard.cpp.o: In function UsbKeyboardDevice': C:\Arduino\arduino-1.0.1\libraries\UsbKeyboard/UsbKeyboard.h:139: undefined reference to usbInit()'
VirtualUsbKeyboard.cpp.o: In function UsbKeyboardDevice::update()': C:\Arduino\arduino-1.0.1\libraries\UsbKeyboard/UsbKeyboard.h:150: undefined reference to usbPoll()'

So near and yet so far.

Someone know the next step?

This is a cross-post isn't it? From your earlier post:

RandallR:
Now I have:

Hello_World.cpp.o: In function `UsbKeyboardDevice':

/UsbKeyboard.h:139: undefined reference to usbInit()' Hello_World.cpp.o: In function UsbKeyboardDevice::update()':
/UsbKeyboard.h:150: undefined reference to usbPoll()' usbdrv.c.o: In function usbGenericSetInterrupt':
...\Temp\build2589925038285248341.tmp/usbdrv.c:240: undefined reference to `usbCrc16Append'

Let's stick to that thread huh? I'll lock this one.

http://arduino.cc/forum/index.php/topic,106835

I responded and you didn't reply.