Question

I have a functioning plugin I've written using the firebreath framework. I need to add MTP read write support to it.

After some research I landed on the libmtp (http://libmtp.sourceforge.net/). I downloaded the source built it and was able to run the examples and read / write to MTP devices.

Next I tried to add use this lib in my Firebreath plugin project. I can compile fine, but I get the below linker errors. I've added to my search library paths the directories with the libusb.a and libiconv.a files.

I've also tried using the Mac Ports version (sudo ports install libmtp +universal)

note: to use libmtp you need libiconv, and libusb installed

Here are the Linker errors im getting in xcode.

Undefined symbols for architecture i386:
  "_libiconv", referenced from:
      _ptp_unpack_string in libmtp.a(libmtp_la-ptp.o)
      _ptp_pack_string in libmtp.a(libmtp_la-ptp.o)
      _utf16_to_utf8 in libmtp.a(libmtp_la-unicode.o)
      _utf8_to_utf16 in libmtp.a(libmtp_la-unicode.o)
  "_libiconv_close", referenced from:
      _LIBMTP_Release_Device in libmtp.a(libmtp_la-libmtp.o)
  "_libiconv_open", referenced from:
      _LIBMTP_Open_Raw_Device_Uncached in libmtp.a(libmtp_la-libmtp.o)
  "_libusb_bulk_transfer", referenced from:
      _ptp_write_func in libmtp.a(libmtp_la-libusb1-glue.o)
      _ptp_usb_getdata in libmtp.a(libmtp_la-libusb1-glue.o)
      _ptp_read_func in libmtp.a(libmtp_la-libusb1-glue.o)
      _ptp_usb_event in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_claim_interface", referenced from:
      _init_ptp_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_clear_halt", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _close_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_close", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _close_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_control_transfer", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _ptp_usb_control_cancel_request in libmtp.a(libmtp_la-libusb1-glue.o)
      _init_ptp_usb in libmtp.a(libmtp_la-libusb1-glue.o)
      _close_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_detach_kernel_driver", referenced from:
      _init_ptp_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_free_config_descriptor", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_free_device_list", referenced from:
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_bus_number", referenced from:
      _LIBMTP_Detect_Raw_Devices in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_config_descriptor", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_device", referenced from:
      _dump_usbinfo in libmtp.a(libmtp_la-libusb1-glue.o)
      _get_playlist_extension in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_device_address", referenced from:
      _LIBMTP_Detect_Raw_Devices in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_device_descriptor", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _LIBMTP_Detect_Raw_Devices in libmtp.a(libmtp_la-libusb1-glue.o)
      _dump_usbinfo in libmtp.a(libmtp_la-libusb1-glue.o)
      _get_playlist_extension in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_device_list", referenced from:
      _LIBMTP_Check_Specific_Device in libmtp.a(libmtp_la-libusb1-glue.o)
      _LIBMTP_Detect_Raw_Devices in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_get_string_descriptor_ascii", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_init", referenced from:
      _LIBMTP_Check_Specific_Device in libmtp.a(libmtp_la-libusb1-glue.o)
      _LIBMTP_Detect_Raw_Devices in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_kernel_driver_active", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _dump_usbinfo in libmtp.a(libmtp_la-libusb1-glue.o)
      _init_ptp_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_open", referenced from:
      _probe_device_descriptor in libmtp.a(libmtp_la-libusb1-glue.o)
      _init_ptp_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_release_interface", referenced from:
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
      _close_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_reset_device", referenced from:
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
      _close_usb in libmtp.a(libmtp_la-libusb1-glue.o)
  "_libusb_set_debug", referenced from:
      _LIBMTP_Check_Specific_Device in libmtp.a(libmtp_la-libusb1-glue.o)
      _LIBMTP_Detect_Raw_Devices in libmtp.a(libmtp_la-libusb1-glue.o)
      _configure_usb_device in libmtp.a(libmtp_la-libusb1-glue.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Was it helpful?

Solution

It won't just link those other libraries automatically... you need to actually add the other libraries to your target_link_libraries statement.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top