环境:
WinXP-SP3(chs) + VS2010-SP1(en-us) + boost 1.47.0 + python 2.7(ActivePython2.7 携带)
boost编译时,boost::python库编译为 stage debug release link=static runtime-link=shared
问题1:
python27 不认dll作为extension
解决方案:
project的output file 和 extension 都设置为 .pyd
问题2:
需要在导出类函数时,支持带指针的参数 (重头戏)
解决方案:
这个问题似乎网上没有一个完整的答案,零零碎碎的问题有一堆,但感觉都不到位,接下来我就给个方案吧。(我对boost::python也不熟,如有错误希望好言指正:) )
1 #include <boost/python.hpp>
2 #include <stdio.h>
3 using namespace boost::python;
4
5 struct World
6 {
7 void simpleHello(void)
8 {
9 printf("this is simple hello\n");
10 }
11 void hello(int *data)
12 {
13 printf("World say hello :%d\n", *data);
14 }
15 int* ready(void)
16 {
17 return new int(1234);
18 }
19 };
20
21 BOOST_PYTHON_MODULE(sample)
22 {
23 class_<World>("World")
24 .def("simpleHello", &World::simpleHello)
25 .def("hello", &World::hello, arg("data"))
26 .def("ready", &World::ready, return_value_policy<return_opaque_pointer>())
27 ;
28 }
这里要说明二点:
1)这个例子既有传指针参数,又有返回指针对象,算是把boost::python两个典型问题囊括了。
2)return_opaque_pointer 是我查官方文档后得到的一个变通(官方推荐这里用 manage_new_object,但不管你编不编的过,反正我是编不过,在翻了Reference manual后看到了 opaque_pointer,看名字觉得有戏,就拿来用了。貌似opaque_pointer的严格性更低一点。编译通过,运行OK,反正就这样了)