2017-01-16 13 views
0

Я пытаюсь скомпилировать сторонний код в общую библиотеку, поэтому я могу вызвать его из Python с помощью ctypes. Это мой первый раз, сознательно работая с общими библиотеками.Связывание ошибок при компиляции разделяемой библиотеки

Я строю код объекта с помощью:

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 как одну из библиотек или объектов, на которые вы ссылаетесь. В зависимости от того, что проще или более уместно.

+1

Да, я смог заставить его работать следующим образом: gcc -shared -fPIC -Wl, -install_name, libelisa3.so -o libelisa3.so elisa3-lib.o usb-comm.o -L/opt/local/lib -lusb-1.0 – user1336958

+0

Удивительный! Рад, что я получил работу –