2010-07-10 7 views
0

Lorsque j'ai essayé de compiler un programme Cela est arrivé:erreur de compilation GCC

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 

Voici mon code, les erreurs de méthode ci-dessus étaient toutes les fonctions de:

/* 
* 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; 
} 

Il n'y a rien que je attraper pour se tromper avec mon code. Aucune suggestion?

Répondre

3

Vous devez inclure -lusb dans les liens de liaison pour lier à libusb. N'oubliez pas d'inclure le chemin de la bibliothèque si nécessaire.

0

Vous n'êtes probablement pas lié à ces librairies de bibliothèques (.so ou .a ou .dylib) - regardez la documentation et voyez avec quelles bibliothèques vous devez lier votre programme.

1

Vous avez probablement manqué la liaison avec la bibliothèque qui a les fonctions pour usb définies en eux.

Il n'y a pas d'erreur liée à l'inclusion lorsque vous transmettez le chemin correct avec l'option -I. Cependant, vous devez le lier avec le -l<libname> et également spécifier l'emplacement de la bibliothèque en utilisant l'option -L<libpath>.