2. 要使用的就是那个swig.exe. 参照例子先写一个C++的类,a.h 和a.cpp。
#pragma once
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Revert
{
public:
Revert(string a1, string a2);
string Output();
private:
string m1;
string m2;
};
#include "a.h"
Revert::Revert(string a1, string a2) : m1(a1), m2(a2)
{
}
string Revert::Output()
{
cout << m2 << " " << m1 << endl;
return m2 + m1;
}
胡乱写的,用std::string作为参数,结果这个在后面还真遇到了问题。
3 仿照例子写接口文件a.i。
%module myAAA
%include "std_string.i"
%{
#include "a.h"
%}
using namespace std;
%include "a.h"
这里一定要注意,用了stl的类作为参数,一定要include相应的.i。否则在python里输入参数时会出现类型错误,类似这种
TypeError: in method 'new_Revert', argument 1 of type 'string'
如果开放namespace, 一定记住要在.i文件里也using namespace.
Swig有专门的文档讲这个:http://www.swig.org/Doc3.0/Library.html#Library_stl_cpp_library
基本涵盖了各种stl的常用类型。
4. 生成wrap源码。
swig.exe -c++ -python a.i
会生成a_wrap.cxx和一个.py文件, myAAA.py
5. 建立一个visual studio win32 dll的project,把a.h a.cpp a_wrap.cxx都加进去,编译。
注意要加上python的头文件和lib,我的是在C:\Python27\include和C:\Python27\libs, 库是python27.lib。如果是安装的python,应该就只有release版。同时请注意是x64的,还是x86的。
6. 一切顺利的话会生成一个dll。将其更名为_myAAA.pyd。注意一定是_myAAA,下划线很重要,因为swig生成的py文件中import _myAAA。否则import myAAA时会出错。
7. 将myAAA.py和_myAAA.pyd放到python可以找到的位置。启动python shell
8. 试试以下代码
import myAAA
c = myAAA.Revert("a", "b")
c.Output()