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

Posted

技术标签:

【中文标题】编译共享库时出现链接错误【英文标题】:Linking errors when compiling a shared library 【发布时间】:2017-01-16 23:32:06 【问题描述】:

我正在尝试将第三方代码编译为共享库,以便可以使用 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 链接?

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的,我能够让它像这样工作:gcc -shared -fPIC -Wl,-install_name,libelisa3.so -o libelisa3.so elisa3-lib.o usb-comm.o - l/opt/local/lib -lusb-1.0

以上是关于编译共享库时出现链接错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试将ImageMagick用作Visual Studio编译器的静态库时出现链接器错误

编译第三方软件包时出现“找不到-lfftw3_omp”错误。如何链接现有的库?

使用 qt creator 和 eigen 库编译程序时出现 lnk2019 错误

实现 pimpl idiom 时出现链接器错误

Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误

编译 mex 文件时出现链接错误