0

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)
Joel
  • 1,309
  • 2
  • 10
  • 20

1 Answers1

1

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

taxilian
  • 14,229
  • 4
  • 34
  • 73
  • I was adding lib search paths manually to xcode for a proof of concept. I'll try adding them through CMake. thanks – Joel Jul 10 '13 at 17:36
  • target_link_libraries(${PROJECT_NAME} /opt/local/lib/libmtp.a ) target_link_libraries(${PROJECT_NAME} /opt/local/lib/libiconv.a ) target_link_libraries(${PROJECT_NAME} /opt/local/lib/libusb-1.0.a ) Worked like a charm thanks again! – Joel Jul 10 '13 at 17:51
  • You can actually do that in one call. Also consider using find_library to make it more tolerant of being used on other systems. – taxilian Jul 10 '13 at 18:11