c - 编译共享库时出现链接错误

标签 c linker shared-libraries ctypes libusb

我正在尝试将第三方代码编译到共享库,以便我可以使用 ctypes 从 Python 调用它。这是我第一次有意识地使用共享库。

我使用以下方法构建目标代码:

gcc -c -fPIC -o elisa3-lib.o ../elisa3-lib.c   
gcc -c -fPIC -o usb-comm.o ../usb-comm.c

然后我尝试构建共享库:

gcc -shared -fPIC -Wl,-install_name,libelisa3.so -o libelisa3.so.1.0 elisa3-lib.o usb-comm.o -lc

我收到链接器错误,因为 usbcomm.c 引用了 libusb.h:

#ifdef __APPLE__
    #include </opt/local/include/libusb-1.0/libusb.h>
#endif

有错误:

Undefined symbols for architecture x86_64:
  "_libusb_bulk_transfer", referenced from:
      _usb_send in usb-comm.o
      _usb_receive in usb-comm.o
  "_libusb_claim_interface", referenced from:
      _openCommunication in usb-comm.o
  "_libusb_close", referenced from:
      _closeCommunication in usb-comm.o
  "_libusb_exit", referenced from:
      _closeCommunication in usb-comm.o
  "_libusb_init", referenced from:
      _openCommunication in usb-comm.o
  "_libusb_open_device_with_vid_pid", referenced from:
      _find_nrf_device in usb-comm.o
  "_libusb_release_interface", referenced from:
      _closeCommunication in usb-comm.o
ld: symbol(s) not found for architecture x86_64

如何正确链接?我是否还需要将 libusb 编译为共享库并使用 -l 链接?

最佳答案

“ undefined symbol ”是链接器找不到的函数/变量。简而言之,是的,您需要将 libusb 作为您要链接的库或对象之一包含在内。选择更容易或更合适的方法。

关于c - 编译共享库时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686722/

相关文章:

c++ - 链接器如何找到正确的文件来使用它的函数声明?

Xcode 4.4 叮当错误 : linker failed

c++ - 应用程序中两个不同版本的库

c - 禁用硬件预取器的效果未反射(reflect)在访问时间中,未显示访问时间的任何差异

c - Visual Studio 2015 链接错误 LNK2005

c - PIC 中的去抖动按钮

java - Web 应用程序中的 Jboss 共享库

c - 函数在目标文件之一中,但链接器不链接它们

c - 未声明变量的操纵杆代码错误

c - 什么是 Antlr3 C 运行时等效于抛出错误报告的异常