首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译C库以在mac OSX 10.8上与python包装器一起使用

编译C库以在mac OSX 10.8上与python包装器一起使用
EN

Stack Overflow用户
提问于 2014-01-21 07:58:38
回答 1查看 247关注 0票数 1

所以我是新手,在过去的几个月里一直在研究python。我最近发现了一个名为PyWiiUse的python库,并想用它在WiiMote上做一些有趣的事情。由于该库只是C库WiiUse的包装器,因此我发现必须先安装这两个库,然后才能启动任何东西。

我有一台运行美洲狮的苹果电脑,我在编译和安装WiiUse库时遇到了一些严重的问题。自述文件中说要使用cmake为源代码生成MakeFile。在安装cmake、xcode和xcode命令行工具之后,我运行了以下命令。

代码语言:javascript
复制
cd /build_directory
cmake /source_directory
make
make install

cmake成功制作了MakeFile,gnu制作了软件并安装了静态库"libwiiuse.a“和头文件"wiiuse.h”。静态库安装到/usr/local/lib,头文件安装到/usr/local/include。

我不知道如何处理静态图书馆。THe自述文件让我相信我会得到一个libwiiuse.so形式的链接库。我阅读了一些静态库,了解到它们只是编译代码的归档文件。我将存档中的.o文件解压缩到名为libwiiuse的文件夹中,并运行以下代码:

代码语言:javascript
复制
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”(共享对象?)文件。我得到的结果是出乎意料的。

代码语言:javascript
复制
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)

所以我几乎被困在这里了。我不确定目标文件是否是为X86 64架构构建的,所以我在所有文件上运行"file“命令,每个文件都得到了相同的结果。

代码语言:javascript
复制
Mach-O 64-bit object x86_64

我知道我想做什么,可能真的很容易,但我一直在努力。有谁可以帮我?

EN

回答 1

Stack Overflow用户

发布于 2016-12-12 09:56:51

在Mac上链接静态wiiuse.a库时,您还需要链接一些Apple框架。尝试将以下内容添加到您的CMakeLists.txt:

代码语言:javascript
复制
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命令将如下所示...

代码语言:javascript
复制
target_link_libraries(${target}
    ${WIIUSE_LIB}
    ${PLATFORM_LIBS})

(我以为静态库可以帮我们解决这个问题,但我错了。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21246608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档