摸索使用MinGW和boost.python确实是件头痛的事情,花了我好几天的时间.废话少说,步入正题:
编译环境:
windows xp sp3、MinGW(GCC) 4.5.2、boost 1.49
第一步:正确安装MinGW(安装tdm-gcc-4.6.1.exe比较方便)和下载boost 1.49,这个网上搜一下就行了。
第二步:解压缩boost_1_49_0.zip到任意的目录,例如我的:F:\Software\boost\boost_1_49_0;
修改\boost_1_49_0\tools\build\v2\user-config.jam最后一行即可:
using python : 2.7 : C:/Python27 : C:/Python27/include : C:/Python27/Libs ;
注意:和;都是使用空格符号隔开的,且目录不能使用\,而要使用/,切记!
第三步:为使用方便,可以将F:\Software\boost\boost_1_49_0加入系统搜索路径,即path变量中.
打开DOS窗口(CMD),使用cd命令进入boost目录(F:\Software\boost\boost_1_49_0),
然后输入如下命令编译
bootstrap.bat gcc
等待约十几秒,可以发现F:\Software\boost\boost_1_49_0\目录下生成了两个文件b2.exe和bjam
第四步:进入\boost_1_49_0\libs\python\example\tutorial目录,运行以下命令:
bjam toolset=gcc variant=release
等待很长时间后,你会发现目录中多了许多文件,其中一个是dll文件,这个文件很重要:
hello_ext.pyd libboost_python-mgw45-1_49.dll
pyd文件就是python的模块文件,可以直接在python中使用
例如:
import hello_ext print hello_ext.greet()
如果提示bjam找不到,请设置一下系统搜索路径,也就是在系统变量path中添加目录F:\Software\boost\boost_1_49_0\,或使用(不推荐)
F:\Software\boost\boost_1_49_0\bjam toolset=gcc variant=release
========================================================================================
以上演示的是使用bjam将c++的代码生成python的扩展模块,学习bjam对于新手来说还是不太方便.
下面介绍直接使用g++命令行生成python的扩展模块:
1.在python的安装目录中找到python27.dll,有些发行版把python27.dll放在其他目录中
2.建立一个测试文件夹如F:\test,将libboost_python-mgw45-1_49.dll和python27.dll都放在里面.
3.在建立测试F:\test\hello_ext.cpp文件如下:
#include <boost/python.hpp> char const* greet() { return "hello, world"; } int add(int x,int y) { return x+y; } BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); def("add", add); }
然后在目录F:\test下使用以下命令,直接编译即可得到python中能使用的扩展模块hello_ext
g++ -o hello_ext.pyd hello_ext.cpp -shared libboost_python-mgw45-1_49.dll python27.dll
可以发现生成了一个动态链接库文件hello_ext.pyd,其实就是hello_ext.dll,只不过python只认*.pyd而已.
下面可以测试了:
In [1]: import hello_ext ...: print hello_ext.greet() ...: print hello_ext.add(1,3) ...: hello, world 4
如果编译时,提示"boost/python.hpp"和pyconfig.h文件找不到,可以给g++的参数设置一下:
-LF:\Software\boost\boost_1_49_0和
-LC:\Python27\include
我为了使用方便,直接将两个目录及其下所有其文件拷贝到minGW的include目录下.这样以后就可以不用每次都"-L"了
注意:扩展模块使用的是动态链接库,所以发布的时候libboost_python-mgw45-1_49.dll和python27.dll必须和
扩展模块放在同一个文件夹里面,否则python调用pyd时会失败.
===================================================================================
下面说说安装boost1.49的问题.
(注意:使用Boost.python并不需要安装Boost)
第一步:同上
第二步:同上
第三步:同上
第四步:在boost的根目录先运行一下命令:
bjam install toolset=gcc --prefix=FC:\boost
编译和安装到一个指定的目录,比如C:\boost.
经过漫长的等待以后,可以发现c:\boost\目录被自动创建,且包含两个目录c:\boost\include\和c:\boost\lib.
使用g++编译boost的所有文件和库都在这个目录里面.
下面给出一个测试正则表达式test.cpp的例子:
#include <boost/regex.hpp> #include <string> #include <iostream> int main() { std::cout << "Enter a regular expression:\n"; std::string s; std::getline(std::cin, s); try { boost::regex reg(s); std::cout << "Enter a string to be matched:\n"; std::getline(std::cin, s); if (boost::regex_match(s, reg)) std::cout << "That's right!\n"; else std::cout << "No, sorry, that doesn't match.\n"; } catch(const boost::bad_expression & e) { std::cout << "Invalid Regular Expression!" << std::endl; std::cout << "Error::" << e.what() << std::endl; } return 0; }
有两种编译方式:
// 可以这样编译 g++ -o test test.cpp -IC:\boost\include\boost-1_49 C:\boost\lib\libboost_regex-mgw45-mt-1_49.a // 也可以这样编译 g++ test.cpp -IC:\boost\include\boost-1_49 -LC:\boost\lib\ -lboost_regex-mgw45-mt-1_49 // -----------------------------------------
当然每次都-I和-L是很烦人的,可以把boost的include和lib下的目录和文件复制到mingw安装目录的include和lib目录下即可.
注意c:\boost\libboost_python-mgw45-mt-1_49.a和libboost_python-mgw45-mt-d-1_49.a是不能使用的,
因为它调用的函数和python27.dll中的函数命名规则不一至(当然可以修复,不过挺繁琐的).
bjam生成的dll已经修复了这个问题,所以在使用boost.python是只能使用
libboost_python-mgw45-1_49.dll(这是release版本)
或者
libboost_python-mgw45-d-1_49.dll(这是debug版本)