在Snow Leopard上安装PyUSB-1.0历险记
写下这篇真是满心恼火。为了一些系统该死的默认设置浪费了我两天时间。
简单描述一下吧。libusb是用于多种操作系统上以用户模式访问USB设备的库,用C语言编写,现在同时可用的有1.0.x和0.1.x两个版本。PyUSB是对libusb的封装,可以同时支持libusb-1.0.x和libusb-0.1.x,同时还支持OpenUSB,这个就不说了。实际中PyUSB有两个版本,0.4.x是使用C扩展模块方式写的,后来测试发现因为太久不更新,连导入的libusb的头文件都不对,几乎没有意义了。而PyUSB-1.0则是使用ctypes方式,本身无C代码,而只是调用libusb的动态库。
而关于操作系统方面,是大约一个月前买的mc374,最近又买了若干工具打算再玩玩无线电。工具里有夹具和恒温焊台,都是很方便的玩意。当然焊接时还是感觉自己的手不够用,如果可以有三只手,分别拿着零件、焊锡丝和烙铁就好了。为了方便调试,可以将一些玩意焊接好以后,用VUSB写个接口板,连接单片机与电脑的USB接口。所以,我需要在macbookpro上安装PyUSB。
PyUSB-1.0本身是纯Python模块,安装简单,安装后尝试搜索设备失败了,提示找不到后端。经过深入代码的逐行调试发现是没有找到libusb库。
通过macports尝试安装了libusb的两个版本,都提示还是找不到,这才发现macports安装各类软件都是在单独的目录。必须自己设置DYLD_LIBRARY_PATH到路径才行。
设置好了库路径提示mach-o, but wrong architecture,大体是说dlopen()打开动态库的时候发现不是同一个体系结构的编译结果。这就晕菜了,到网上找到了判断动态库体系结构的命令。 "lipo -info <libfile>" ,可见macports安装的库都是通过Xcode自带的gcc编译的,默认都是x86_64的。而我在python.org下载的MacPython中的库全都是"i386 ppc"。难怪两者不兼容。
好吧,继续尝试。自己下载了libusb-1.0.8的源码包,编译安装后还是x86_64的。
既然此路不通,就尝试自己重新编译ctypes,让其体系结构也成为x86_64的。不过发现MacPython没有带开发的库。于是通下决心用macports来安装Python2.5。安装好以后还需要到"~/.profile"中去掉MacPython设置的PATH才能正确启动。这个安装好以后是Python2.5.5,不过居然没有自带ctypes,我真是,…
当然了macports中有附带py24-ctypes和py26-ctypes,唯独没有给Python2.5的。
咬牙继续,现在有Python开发包了,就去自己编译安装ctypes。结果发现其中报一些语法错误,应该是某些类型定义被误认为不是类型了。出现在爱ffi.h:161开始的几处。进去代码看看,完全没有手工修改的思路。放弃。
尝试安装PyUSB-0.4.3,发现其引用头文件usb.h,而现代的libusb已经叫做libusb.h了。编译过不去,放弃。
进去macports安装的Python2.5.5的库路径,看了_ctypes*.dylib这些文件,挨个尝试,都失败了,包括从MacPython-2.5.4拷贝过去的。
整理思路,我还没疯。继续研究刚才的PyUSB-1.0配合libusb-1.0.8。现在只要能将libusb-1.0.8编译成i386架构即可。于是继续在configure以后修改其Makefile。最终在libusb-1.0.8/libusb/Makefile的137和156行,加上了"-arch i386"。构建,安装,通过。