Don't mix LDFLAGS and LDLIBS

Compilation of kinect_upload_fw (from kinect-audio-setup) was failing on some systems with messages like:

cc -lusb-1.0    kinect_upload_fw.o   -o kinect_upload_fw
kinect_upload_fw.o: In function `get_reply':
kinect_upload_fw.c:(.text+0x8b): undefined reference to `libusb_bulk_transfer'
kinect_upload_fw.o: In function `main':
kinect_upload_fw.c:(.text.startup+0x76): undefined reference to `libusb_init'
kinect_upload_fw.c:(.text.startup+0x82): undefined reference to `libusb_set_debug'
kinect_upload_fw.c:(.text.startup+0x93): undefined reference to `libusb_open_device_with_vid_pid'
kinect_upload_fw.c:(.text.startup+0xb5): undefined reference to `libusb_set_configuration'
kinect_upload_fw.c:(.text.startup+0xc3): undefined reference to `libusb_claim_interface'
kinect_upload_fw.c:(.text.startup+0x151): undefined reference to `libusb_bulk_transfer'
kinect_upload_fw.c:(.text.startup+0x189): undefined reference to `libusb_close'
kinect_upload_fw.c:(.text.startup+0x190): undefined reference to `libusb_exit'
kinect_upload_fw.c:(.text.startup+0x1f3): undefined reference to `libusb_bulk_transfer'
kinect_upload_fw.c:(.text.startup+0x2f4): undefined reference to `libusb_bulk_transfer'
kinect_upload_fw.c:(.text.startup+0x345): undefined reference to `libusb_bulk_transfer'
kinect_upload_fw.c:(.text.startup+0x469): undefined reference to `libusb_bulk_transfer'
collect2: ld returned 1 exit status
make[1]: *** [kinect_upload_fw] Error 1

even though libusb-1.0 was correctly installed on the system.

This was happening because I was putting the -lusb-1.0 option into LDFLAGS. Well, this is not how you are supposed to do it, especially when you rely on implicit rules of GNU Make, you must use LDLIBS (or the equivalent LOADLIBES) instead.

Here are the facts of the issue:

  • When some options, like -Wl,--as-needed, are passed to the compiler (and then to the linker) the order of linking options becomes important: libraries must be specified after the objects in the linking command.
  • I was specifying the libraries into LDFLAGS:
    LDFLAGS += $(shell pkg-config --libs libusb-1.0)
    
  • The implicit Make rule generates something like this:
    LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
    kinect_upload_fw: kinect_upload_fw.o
    	$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
    
    where LDFLAGS is expanded before anything else, and the linker couldn't figure out the libraries to use for linking; note that LDLIBS comes after $^ which is the automatic variable expanded to the prerequisites of the rule (the objects, namely kinect_upload_fw.o in this case).

A fix for kinect_upload_fw has been pushed in 863d1b3.


CommentiCondividi contenuti

Invia nuovo commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente
  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Linee e paragrafi vanno a capo automaticamente.

Ulteriori informazioni sulle opzioni di formattazione

CAPTCHA
Questa domanda serve a verificare che il form non venga inviato da procedure automatizzate
w
z
u
p
u
F
Enter the code without spaces.