在Windows上安装pymatbridge
在pymatbridge的0.3版本中,增加了一个新的依赖项,就是ZMQ。为了安装这个版本,你可能需要编译一个叫做messenger
的mex扩展,并且这个扩展需要链接一个zeromq的dll文件。不过,这在某些情况下会变得相当困难。
有没有人能分享一下在Windows系统上从源代码安装pymatbridge成功的例子呢?
3 个回答
我使用Visual Studio作为我的标准开发工具,经过一些调整,终于搞定了构建过程。
VS 2013
Matlab 2013b x64
Python 3.3 x64
ZeroMQ 4.0.4.
如果你使用不同的版本,请确保在必要的地方调整路径。
在Visual Studio(2013)中构建 messenger
- 首先创建一个新的解决方案,里面放一个空的C++项目。
- 设置配置,比如选择x64和Release模式。
- 打开项目属性,设置以下内容:
配置属性 -> 常规:
目标名称: messenger
目标扩展名: .mexw64
配置类型: 动态库 (.dll)
配置属性 -> VC++ 目录 -> 包含目录:
MATLAB路径\extern\include
ZEROMQ路径\include
配置属性 -> VC++ 目录 -> 库目录:
MATLAB路径\extern\lib\win64\microsoft
ZEROMQ路径\lib
配置属性 -> 链接器 -> 输入 -> 额外依赖项:
libmx.lib; libmex.lib; libmat.lib; libzmq-v120-mt-4_0_4.dll
配置属性 -> 链接器 -> 命令行 -> 额外选项:
/export:mexFunction
- 将
messenger.c
添加为源文件 - 构建库
- 将其复制到: PYTHONPATH\Lib\site-packages\pymatbridge\matlab\
请注意:
我遇到了一些不兼容的错误,原因是函数名与windows.h中已有的函数名冲突。解决办法是重命名:
- initialize
- listen
- respond
- cleanup
改为:
- initializeMat
- listenMat
- respondMat
- cleanupMat
这是我的设置和构建说明,抱歉有点啰嗦——这些内容来自我为实验室笔记写的记录。
规格:
Windows 8.1 (64 bit)
Anaconda 1.9.1
python 2.7.6
MinGW
TDM GCC 4.8.1
首先,我安装了 MS Visual C++ & SDK 7.1
。安装失败的一个可能原因是电脑上已经有其他版本的 Visual C++ 编译器和/或 SDK。在成功安装 SDK 7.1 之前,我不得不卸载掉好几个其他版本。
接下来,我使用 Windows SDK 7.1 Command Prompt
,我
mex -setup
并选择了新安装的编译器。在我的情况下
Select a compiler:
[1] Microsoft Software Development Kit (SDK) 7.1 in
C:\Program Files (x86)\Microsoft Visual Studio 10.0
[0] None
Compiler:
我选择了编号 1
。
然后我下载并安装了一个预编译的 64 位 ZMQ 3.2.4
,从 ZMQ 3.2.4 的安装位置 C:\Program Files\ZeroMQ 3.2.4\lib
,我把 libzmq-v90-mt_3_2_4.lib
和 libzmq-v90-mt_3_2_4.dll
从 C:\Program Files\ZeroMQ 3.2.4\bin
复制到了消息构建目录 ~\python-matlab-bridge\messenger\src
。我还把 zmq.h
和 zmq_utils.h
放到了那个目录,但现在不太确定它们是否真的必要。
然后,在 Windows SDK 7.1 Command Prompt
中,我进入了 messenger\src
目录,并输入了
mex messenger.c libzmq-v90-mt-3_2_4.lib -O -output messenger
以获得一个 messenger.mexw64
。
最后,在 ~\python-matlab-bridge
目录中,我使用 MinGW
,我只需
python setup.py install
这会自动将构建好的包放入我的 Anaconda\Lib\site-packages
中,并附带一个 egg 信息。在 Anaconda\Lib\site-packages\pymatbridge\matlab
中,有之前构建的 messenger.mexw64
,它来自 ~\python-matlab-bridge\messenger\src
。我还把所有其他的 .dll
、.lib
和 .h
文件复制到了 Anaconda\Lib\site-packages\pymatbridge\matlab
,以防万一。
现在在 iPython 2.7 console
或者 iPython Notebook 中,我可以
%load_ext pymatbridge
成功运行。
有些其他的回答有点过时了,现在这个事情可以更简单地完成(不过在Linux系统上还是不太容易 :/)。首先,pymatbridge现在在Windows上包含了一个二进制的mex文件,它已经和libzmq静态链接了,所以你实际上不需要编译任何东西就能让它工作。
不过,如果你还是想从源代码编译,过程对于动态链接库来说也不是太复杂。
1) 从网站上安装zeromq:http://zeromq.org/distro:microsoft-windows
2) 在ZeroMQ安装目录中,把一个lib/libzmq-*.lib文件重命名为libzmq.lib。
3) 把ZeroMQ的bin目录添加到你的系统路径中。
4) 编辑messenger/mexw64/local.cfg文件,指向zeromq的安装目录(你需要更新ZMQ_INC和ZMQ_LIB两个部分)。同时确保MATLAB的目录是正确的。
5) 在messenger目录下运行make.py matlab
。这应该会生成messenger.mexw64。
静态链接库在实际操作中比较简单,但因为zeromq(截至目前)没有提供用于Windows安装的静态链接.lib文件,所以你需要自己编译这个文件。得到静态的.lib文件后,用make matlab --static
来构建messenger.mexw64。