3

I have this very simple piece of code that I'm trying to compile. I'm fairly new to GCC from the command line, so please forgive me. I've tried a quite few different things with GCC, but I'm still unable to get it to compile. I do have libusb installed. How can I get this piece of code to compile?

Libusb:

anything:usb mymac$ brew list libusb
/usr/local/Cellar/libusb/1.0.9/include/libusb-1.0/libusb.h
/usr/local/Cellar/libusb/1.0.9/lib/libusb-1.0.0.dylib
/usr/local/Cellar/libusb/1.0.9/lib/pkgconfig/libusb-1.0.pc
/usr/local/Cellar/libusb/1.0.9/lib/ (2 other files)
anything:usb mymac$

GCC attempts (all failed):

gcc -o xout usbtest.c
gcc -o xout usbtest.c -lusb-1.0
gcc -L/usr/local/Cellar/libusb/1.0.9/lib -o xout usbtest.c -lusb-1.0

Error for all attempts:

usbtest.c:3:10: fatal error: 'libusb.h' file not found
#include <libusb.h>

Code:

#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>

int main(int argc, const char * argv[])
{
    libusb_device **devs;
    libusb_context *context = NULL;

    size_t list;
    //size_t i;
    int ret;

    ret = libusb_init(&context);

    if(ret < 0)
    {
        perror("libusb_init");
        exit(1);
    }

    list = libusb_get_device_list(context, &devs);

    printf("There are %zd devices found\n", list);

    return 0;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • Could you include the full output of GCC in each case so we can see the error messages? The error messages are like big clues that tell you how to fix the problem. Well, don't bother with the first invocation of GCC because there is no way that would work. – David Grayson Dec 06 '13 at 05:44
  • @DavidGrayson sorry about that. –  Dec 06 '13 at 13:16

2 Answers2

2

So I had a similar issue, for some reason gcc doesnt include /usr/local/lib in its default search path on OS X. The quick fix is to add:

-lusb-1.0

to the gcc commands and it should compile.

Brandon
  • 21
  • 2
1

You are not telling gcc where to look for the header files. This is done by the -I option on the gcc command line for compiling.

e.g.

gcc -I /usr/local/include -o xout usbtest.c

I think Homebrew does provide a symbolic link frominside the Cellar to /usr/local

mmmmmm
  • 32,227
  • 27
  • 88
  • 117
  • 1
    He'll likely need to adjust his `#include` too if he points at just the include directory: `#include `. – John Szakmeister Dec 06 '13 at 13:21
  • @Mark This solved the missing file problem. Thank you. Btw... Here is the link homebrew created: `lrwxr-xr-x 1 kyle admin 41 Dec 5 22:38 libusb-1.0 -> ../Cellar/libusb/1.0.9/include/libusb-1.0` –  Dec 06 '13 at 13:41
  • @KyleRogers which directory was that in? – mmmmmm Dec 06 '13 at 13:41
  • @Mark /usr/local/include –  Dec 06 '13 at 13:42
  • @Mark I now get a different error. Any thoughts? `Undefined symbols for architecture x86_64: "_libusb_get_device_list", referenced from: _main in usbtest-7VJQQT.o "_libusb_init", referenced from: _main in usbtest-7VJQQT.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)` –  Dec 06 '13 at 13:43
  • @Mark I know this code works and is valid because I have it working with XCode. I'm just trying to learn a bit more about using gcc and command line. –  Dec 06 '13 at 13:43
  • Well Xcode etc is using clang and not gcc - but that should not matter - as for that we need to see your makefile or whatever you are using to combine the results - there is a reason to use Xcode makes lfe much easier – mmmmmm Dec 06 '13 at 13:48
  • The "Undefined symbols" issue is a path issue also; just the library path (-L) instead of the include path (-I). – geowar Oct 22 '17 at 19:44
  • For me it was `-I /opt/homebrew/include/libusb-1.0/` – Rick Dec 19 '22 at 23:05