Компиляция библиотеки C для использования с оболочкой Python на Mac OSX 10.8

Так что я новичок, который изучал питон в течение последних нескольких месяцев. Недавно я обнаружил библиотеку Python под названием PyWiiUse и хотел использовать ее для создания забавных вещей с WiiMote. Поскольку библиотека является просто оболочкой библиотеки C WiiUse, я обнаружил, что мне нужно установить обе библиотеки, прежде чем я смог что-либо запустить.

У меня есть макинский бегущий горный лев, и у меня возникли серьезные проблемы с компиляцией и установкой библиотеки WiiUse. README говорит использовать cmake для генерации MakeFile для исходного кода. Я выполнил следующую команду после установки инструментов командной строки cmake, xcode и xcode.

cd /build_directory
cmake /source_directory
make
make install

cmake успешно создал MakeFile, а gnu создала программное обеспечение и установила статическую библиотеку "libwiiuse.a" и файл заголовка "wiiuse.h". Статическая библиотека была установлена ​​в /usr/local/lib, а файл заголовка был установлен в /usr/local/include.

Я не знал, что делать со стационарной библиотекой. Файл README заставил меня поверить, что я получу связанную библиотеку в форме libwiiuse.so. Я прочитал о статических библиотеках и узнал, что это всего лишь архивы скомпилированного кода. Я извлек файлы.o из архива в папку с именем libwiiuse и запустил следующий код:

gcc -shared -o libwiiuse.so io.o os_mac_find.o classic.o ir.o os_mac_interface.o dynamics.o motion_plus.o util.o events.o nunchuk.o wiiboard.o guitar_hero_3.o os_mac.o wiiuse.o

Я попытался скомпилировать все файлы ".o"(объект?) В один файл ".so"(общий объект?). Результат, который я получил, был неожиданным.

Undefined symbols for architecture x86_64:
"_IOBluetoothNSStringFromDeviceAddress", referenced from:
  -[WiiuseDeviceInquiry collectResultsOf:] in os_mac_find.o
"_NSDefaultRunLoopMode", referenced from:
  -[WiiuseDeviceInquiry wait] in os_mac_find.o
  -[WiiuseWiimote waitForIncomingData:] in os_mac.o
"_OBJC_CLASS_$_IOBluetoothDeviceInquiry", referenced from:
  objc-class-ref in os_mac_find.o
_OBJC_CLASS_$_IOBluetoothHostController", referenced from:
  objc-class-ref in os_mac_find.o
"_OBJC_CLASS_$_NSAutoreleasePool", referenced from:
  objc-class-ref in os_mac_find.o
  objc-class-ref in os_mac_interface.o
  objc-class-ref in os_mac.o
"_OBJC_CLASS_$_NSData", referenced from:
  objc-class-ref in os_mac.o
"_OBJC_CLASS_$_NSDate", referenced from:
  objc-class-ref in os_mac_find.o
  objc-class-ref in os_mac.o
"_OBJC_CLASS_$_NSLock", referenced from:
  objc-class-ref in os_mac.o
"_OBJC_CLASS_$_NSMutableArray", referenced from:
  objc-class-ref in os_mac.o
"_OBJC_CLASS_$_NSObject", referenced from:
  _OBJC_CLASS_$_WiiuseDeviceInquiry in os_mac_find.o
  _OBJC_CLASS_$_WiiuseWiimote in os_mac.o
  _OBJC_CLASS_$_WiiuseDisconnectionMessage in os_mac.o
  _OBJC_CLASS_$_WiiuseReceivedData in os_mac.o
"_OBJC_CLASS_$_NSRunLoop", referenced from:
  objc-class-ref in os_mac_find.o
  objc-class-ref in os_mac.o
"_OBJC_METACLASS_$_NSObject", referenced from:
  _OBJC_METACLASS_$_WiiuseDeviceInquiry in os_mac_find.o
  _OBJC_METACLASS_$_WiiuseWiimote in os_mac.o
  _OBJC_METACLASS_$_WiiuseReceivedData in os_mac.o
  _OBJC_METACLASS_$_WiiuseDisconnectionMessage in os_mac.o
"__objc_empty_cache", referenced from:
  _OBJC_CLASS_$_WiiuseDeviceInquiry in os_mac_find.o
  _OBJC_METACLASS_$_WiiuseDeviceInquiry in os_mac_find.o
  _OBJC_CLASS_$_WiiuseWiimote in os_mac.o
  _OBJC_CLASS_$_WiiuseDisconnectionMessage in os_mac.o
  _OBJC_CLASS_$_WiiuseReceivedData in os_mac.o
  _OBJC_METACLASS_$_WiiuseWiimote in os_mac.o
  _OBJC_METACLASS_$_WiiuseReceivedData in os_mac.o
  ...
"__objc_empty_vtable", referenced from:
  _OBJC_CLASS_$_WiiuseDeviceInquiry in os_mac_find.o
  _OBJC_METACLASS_$_WiiuseDeviceInquiry in os_mac_find.o
  _OBJC_CLASS_$_WiiuseWiimote in os_mac.o
  _OBJC_CLASS_$_WiiuseDisconnectionMessage in os_mac.o
  _OBJC_CLASS_$_WiiuseReceivedData in os_mac.o
  _OBJC_METACLASS_$_WiiuseWiimote in os_mac.o
  _OBJC_METACLASS_$_WiiuseReceivedData in os_mac.o
  ...
"_objc_msgSend", referenced from:
  -[WiiuseDeviceInquiry initWithMemory:maxDevices:timeout:] in os_mac_find.o
  -[WiiuseDeviceInquiry start] in os_mac_find.o
  -[WiiuseDeviceInquiry wait] in os_mac_find.o
  -[WiiuseDeviceInquiry collectResultsOf:] in os_mac_find.o
  -[WiiuseDeviceInquiry run] in os_mac_find.o
  _wiiuse_os_find in os_mac_find.o
  _wiiuse_os_connect_single in os_mac_interface.o
  ...
"_objc_msgSendSuper2", referenced from:
  -[WiiuseDeviceInquiry initWithMemory:maxDevices:timeout:] in os_mac_find.o
  -[WiiuseWiimote initWithPtr:device:] in os_mac.o
  -[WiiuseWiimote dealloc] in os_mac.o
  -[WiiuseReceivedData initWithData:] in os_mac.o
  -[WiiuseReceivedData dealloc] in os_mac.o
"_objc_msgSend_fixup", referenced from:
  l_objc_msgSend_fixup_release in os_mac_find.o
  l_objc_msgSend_fixup_count in os_mac_find.o
  l_objc_msgSend_fixup_objectAtIndex_ in os_mac_find.o
  l_objc_msgSend_fixup_alloc in os_mac_find.o
  l_objc_msgSend_fixup_alloc in os_mac_interface.o
  l_objc_msgSend_fixup_release in os_mac_interface.o
  l_objc_msgSend_fixup_retain in os_mac.o
  ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Так что я застрял здесь. Я не был уверен, что объектные файлы были buildt для архитектуры X86 64, поэтому я запустил команду "file" для всех файлов и получил одинаковый результат для каждого из них.

Mach-O 64-bit object x86_64

Я знаю, что я хочу сделать, возможно, это действительно легко, но я боролся здесь. Может кто-нибудь мне помочь?

1 ответ

При связывании статической библиотеки wiiuse.a на Mac вам также необходимо связать некоторые фреймворки Apple. Попробуйте добавить следующее в ваш CMakeLists.txt:

set(PLATFORM_LIBS)
if(APPLE)
    find_library(IOBLUETOOTH_FRAMEWORK
        NAMES
        IOBluetooth)
    find_library(COREFOUNDATION_FRAMEWORK
        NAMES
        CoreFoundation)
    find_library(FOUNDATION_FRAMEWORK
        NAMES
        Foundation)
    list(APPEND PLATFORM_LIBS
        ${IOBLUETOOTH_FRAMEWORK}
        ${COREFOUNDATION_FRAMEWORK}
        ${FOUNDATION_FRAMEWORK})
endif(APPLE)

Затем, после создания вашей цели, команда cmake link будет выглядеть так...

target_link_libraries(${target}
    ${WIIUSE_LIB}
    ${PLATFORM_LIBS})

(Я думал, что статическая библиотека позаботится об этом за нас, но я ошибся.)

Другие вопросы по тегам