【问题标题】:Cannot link libmtp in a firebreath project on OSx无法在 OSx 上的 firebreath 项目中链接 libmtp
【发布时间】:2013-07-10 01:22:08
【问题描述】:

我有一个使用 firebreath 框架编写的功能正常的插件。我需要为其添加 MTP 读写支持。

经过一番研究,我选择了 libmtp (http://libmtp.sourceforge.net/)。我下载了构建它的源代码,并且能够运行示例并读取/写入 MTP 设备。

接下来我尝试在我的 Firebreath 插件项目中添加使用这个库。我可以很好地编译,但我得到以下链接器错误。我已将包含 libusb.a 和 libiconv.a 文件的目录添加到我的搜索库路径中。

我也尝试过使用 Mac Ports 版本(sudo ports install libmtp +universal)

注意:要使用 libmtp,您需要安装 libiconv,并安装 libusb

这是我在 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)

【问题讨论】:

    标签: xcode firebreath mtp


    【解决方案1】:

    它不会自动链接那些其他库...您需要将其他库实际添加到您的 target_link_libraries 语句中。

    【讨论】:

    • 我手动将 lib 搜索路径添加到 xcode 以进行概念验证。我将尝试通过 CMake 添加它们。谢谢
    • 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 ) 再次感谢!
    • 您实际上可以在一个电话中做到这一点。还可以考虑使用 find_library 以使其更能容忍在其他系统上使用。
    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2013-07-01
    • 2014-05-23
    • 2016-06-28
    相关资源
    最近更新 更多