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版本)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了方便大家使用MinGWGCC)+_boost.python,特意只做了三个dll,可以很方便地将c++代码转为python模块. libboost_python-mgw45-1_49.dll libboost_python-mgw45-d-1_49.dll python27.dll 这三个文件我已放在资源里面,大家可以下载. 下面说说使用方法: 第一步:编写一个hello_ext.cpp的c++源文件 #include <boost/python.hpp> // 第一行必须是#include <boost/python.hpp> // 否则会留下一点小问题 #include <vector> // 输出字符串 char const* greet() { return "hello, world"; } // 实现两个数字相加 int add(int x, int y) { return x + y; } // 打印vector的函数 void vprint() { std::vector<int>myvector; for (int i = 1; i <= 5; i++) { myvector.push_back(i); } std::vector<int>::iterator it; std::cout << "myvector contains:"; for (it = myvector.begin(); it < myvector.end(); it++) { std::cout << " " << *it; } std::cout << std::endl; } // 定义python模块的接口文件 BOOST_PYTHON_MODULE(hello_ext) { // hello_ext为导出python模块的名字 using namespace boost::python; def("greet", greet); // 导出函数greet def("add", add); // 导出函数add def("vprint", vprint); // 导出函数vprint } 将上面的文件一定要保存为utf-8的格式(使用记事本在保存的时候就可以选择),不推荐Ansi格式! 然后就可以使用下面的命令编译python模块了: g++ -o hello_ext.pyd hello_ext.cpp -shared libboost_python-mgw45-1_49.dll python27.dll 也可以使用如下的命令,编译debug版本 g++ -o hello_ext.pyd hello_ext.cpp -shared libboost_python-mgw45-d-1_49.dll python27.dll 运行上面的命令之前,请确保hello_ext.cpp,libboost_python-mgw45-1_49.dll,libboost_python-mgw45-d-1_49.dll和 python27.dll在同一个目录. hello_ext.pyd就是python中能直接使用的动态链接库,windows一般以dll为后缀,而python只承认pyd文件. 下面来测试一下: import hello_ext print hello_ext.greet() print hello_ext.add(1,3) hello_ext.vprint() 输出为: hello, world 4 myvector contains: 1 2 3 4 5 看,成功了! ============================================================================= 使用g++编译常见的问题就是找不到文件<boost/python.hpp>和pyconfig.h等文件. 这些文件其实在boost的目录下面和C:\Python27\include目录中. 为了使用方便,将整个\boost_1_49_0\boost\目录复制到MinGw的include目录下面; 将C:\Python27\include目录下的文件全部复制到MinGw的include目录下面即可. 如果不想复制,也可以给g++设置-L参数 -LC:\boost\include\boost_1_49_0\ 和-LC:\Python27\include, 不过每次都这样,还是麻烦,不如复制一下彻底解决! 在发布hello_ext.pyd的时候,由于是动态链接库,所以不要忘了libboost_python-mgw45-1_49.dll, libboost_python-mgw45-d-1_49.dll和 python27.dll也要一起发布!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值