MinGW(GCC)和boost.python

摸索使用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版本)

你可能感兴趣的:(python,正则表达式,gcc,regex,扩展,include)