Ошибка компиляции GCC - PullRequest
0 голосов
/ 10 июля 2010

Когда я пытался скомпилировать программу, это получилось:

C:\Users\Mohit\Developer\C_Workspace\iPhoneInteraction\Debug>make all
Building file: ../src/test.c
Invoking: Cygwin C Compiler
gcc -I"C:\cygwin\usr\include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"s
rc/test.d" -MT"src/test.d" -o"src/test.o" "../src/test.c"
cygwin warning:
  MS-DOS style path detected: C:/cygwin/usr/include
  Preferred POSIX equivalent is: /usr/include
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
Finished building: ../src/test.c

Building target: iPhoneInteraction.exe
Invoking: Cygwin C Linker
gcc  -o"iPhoneInteraction.exe"  ./src/test.o
./src/test.o: In function print_device':
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:70: undefined reference to '_usb_open'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:73: undefined reference to '_usb_get_string_simple'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:84: undefined reference to '_usb_get_string_simple'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:104: undefined reference to '_usb_get_string_simple'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:112: undefined reference to '_usb_close'
./src/test.o: In function 'main':
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:137: undefined reference to '_usb_init'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:139: undefined reference to '_usb_find_busses'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:140: undefined reference to '_usb_find_devices'
/cygdrive/c/Users/Mohit/Developer/C_Workspace/iPhoneInteraction/Debug/../src/tes
t.c:142: undefined reference to '_usb_get_busses'
collect2: ld returned 1 exit status
make: *** [iPhoneInteraction.exe] Error 1  

Вот мой код, все ошибки метода, описанные выше, были функциями из:

/*
 * testlibusb.c
 *
 *  Test suite program
 */

#include <stdio.h>
#include <string.h>
#include <usb.h>

int verbose = 0;

void print_endpoint(struct usb_endpoint_descriptor *endpoint)
{
    printf("      bEndpointAddress: %02xh\n", endpoint->bEndpointAddress);
    printf("      bmAttributes:     %02xh\n", endpoint->bmAttributes);
    printf("      wMaxPacketSize:   %d\n", endpoint->wMaxPacketSize);
    printf("      bInterval:        %d\n", endpoint->bInterval);
    printf("      bRefresh:         %d\n", endpoint->bRefresh);
    printf("      bSynchAddress:    %d\n", endpoint->bSynchAddress);
}

void print_altsetting(struct usb_interface_descriptor *interface)
{
    int i;

    printf("    bInterfaceNumber:   %d\n", interface->bInterfaceNumber);
    printf("    bAlternateSetting:  %d\n", interface->bAlternateSetting);
    printf("    bNumEndpoints:      %d\n", interface->bNumEndpoints);
    printf("    bInterfaceClass:    %d\n", interface->bInterfaceClass);
    printf("    bInterfaceSubClass: %d\n", interface->bInterfaceSubClass);
    printf("    bInterfaceProtocol: %d\n", interface->bInterfaceProtocol);
    printf("    iInterface:         %d\n", interface->iInterface);

    for (i = 0; i < interface->bNumEndpoints; i++)
        print_endpoint(&interface->endpoint[i]);
}

void print_interface(struct usb_interface *interface)
{
    int i;

    for (i = 0; i < interface->num_altsetting; i++)
        print_altsetting(&interface->altsetting[i]);
}

void print_configuration(struct usb_config_descriptor *config)
{
    int i;

    printf("  wTotalLength:         %d\n", config->wTotalLength);
    printf("  bNumInterfaces:       %d\n", config->bNumInterfaces);
    printf("  bConfigurationValue:  %d\n", config->bConfigurationValue);
    printf("  iConfiguration:       %d\n", config->iConfiguration);
    printf("  bmAttributes:         %02xh\n", config->bmAttributes);
    printf("  MaxPower:             %d\n", config->MaxPower);

    for (i = 0; i < config->bNumInterfaces; i++)
        print_interface(&config->interface[i]);
}

int print_device(struct usb_device *dev, int level)
{
    usb_dev_handle *udev;
    char description[256];
    char string[256];
    int ret, i;

    udev = usb_open(dev);
    if (udev) {
        if (dev->descriptor.iManufacturer) {
            ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer, string, sizeof(string));
    if (ret > 0)
        snprintf(description, sizeof(description), "%s - ", string);
    else
        snprintf(description, sizeof(description), "%04X - ",
             dev->descriptor.idVendor);
    } else
        snprintf(description, sizeof(description), "%04X - ",
           dev->descriptor.idVendor);

    if (dev->descriptor.iProduct) {
        ret = usb_get_string_simple(udev, dev->descriptor.iProduct, string, sizeof(string));
        if (ret > 0)
        snprintf(description + strlen(description), sizeof(description) -
             strlen(description), "%s", string);
    else
        snprintf(description + strlen(description), sizeof(description) -
             strlen(description), "%04X", dev->descriptor.idProduct);
    } else
        snprintf(description + strlen(description), sizeof(description) -
           strlen(description), "%04X", dev->descriptor.idProduct);

 } else
    snprintf(description, sizeof(description), "%04X - %04X",
         dev->descriptor.idVendor, dev->descriptor.idProduct);

 printf("%.*sDev #%d: %s\n", level * 2, "                    ", dev->devnum,
     description);

 if (udev && verbose) {
 if (dev->descriptor.iSerialNumber) {
      ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));
      if (ret > 0)
      printf("%.*s  - Serial Number: %s\n", level * 2,
           "                    ", string);
  }
}

if (udev)
    usb_close(udev);

if (verbose) {
  if (!dev->config) {
    printf("  Couldn't retrieve descriptors\n");
    return 0;
  }

  for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
    print_configuration(&dev->config[i]);
} else {
      for (i = 0; i < dev->num_children; i++)
        print_device(dev->children[i], level + 1);
    }

  return 0;
}

int main(int argc, char *argv[])
{
  struct usb_bus *bus;

  if (argc > 1 && !strcmp(argv[1], "-v"))
    verbose = 1;

  usb_init();

  usb_find_busses();
  usb_find_devices();

  for (bus = usb_busses; bus; bus = bus->next) {
    if (bus->root_dev && !verbose)
      print_device(bus->root_dev, 0);
    else {
      struct usb_device *dev;

      for (dev = bus->devices; dev; dev = dev->next)
        print_device(dev, 0);
    }
 }

 return 0;
}

Нет ничего, чтоЯ поймал, что был не прав с моим кодом.Есть предложения?

Ответы [ 3 ]

3 голосов
/ 10 июля 2010

Вы должны включить -lusb в флаги ссылки для ссылки на libusb. Также не забудьте указать путь к библиотеке, если это необходимо.

1 голос
/ 10 июля 2010

Возможно, вы пропустили соединение с библиотекой, в которой определены функции для usb.

Нет ошибки, связанной с включением, поскольку вы передаете правильный путь с опцией -I. Однако вы должны связать его с -l<libname>, а также указать местоположение библиотеки, используя опцию -L<libpath>.

0 голосов
/ 10 июля 2010

Вы, вероятно, не ссылаетесь на библиотеки libs (.so или .a или .dylib) - посмотрите документацию и посмотрите, с какими библиотеками вам нужно связать вашу программу.

...