在网上找了蛮久的资料,各种试了一下。根据以下链接,记录一个过程,参考博客如下:
https://www.jianshu.com/p/a257e630fe42
步骤一:
可以在swig官网www.swig.org下载,解压后将swig.exe的路径添加到环境变量path中即可使用swig
步骤二:
我是用的VS2015新建一个Win32 Console Application,注意在Application Settings中选择DLL以及空项目。完成后将工程的配置改成release,我的是64位的计算机,改成X64
c++的头文件如下:
#include <iostream>
using namespace std;
class example {
private:
int num;
public:
void say_hello(void);
void change(int din);
int get_num();
};
源文件如下:
#include "example.h"
void example::say_hello(void) {
cout << "hello python,I am C++" << endl;
}
void example::change(int din) {
num = din;
}
int example::get_num(void) {
return num;
}
步骤三:使用Swig封装
swig封装需要一个.i
后缀文件的封装说明,其中
%module <name>
为封装名称,Python调用的包名就是<name>
%{...%}
为附加的函数说明和头文件,源文件以外的部分都要包括在这里,包括头文件和宏定义等
之后为要封装的函数或类,可以直接引用头文件(若已经将要封装的部分的声明写在头文件中
%module Example_swig
%{
#include "example.h"
%}
%include "example.h"
调用swig封装
在命令行中一直cd到.i文件所在的目录,在命令行中输入swig -python -c++ XXX.i
,其中XXX.i
为上面写的说明文件
swig -python -c++ example.i
调用后生成两个文件:
XXX_wrap.cxx文件和XXX.py文件
步骤四:使用VS编译
引入Python库
在项目->属性
中配置Python的库
- 在
VC++目录
中的包含目录
中,导入Python安装路径下的include路径(包含Python.h) - 在
链接器->常规
的附加库目录
中,导入Python安装路径下的libs路径(注意不是Lib路径,包括dll文件)
编译输出
将刚才调用swig封装而生成的XXX_wrap.cxx文件添加到项目工程中,然后编译,会在解决方案的文件夹(不是项目文件夹,我一开始一直在这里找,什么也没找到)下的X64->Release文件夹下有一个dll文件,即为编译输出的动态链接库。将其名称改为_<name>.pyd
(本例中为Example_swig.pyd
),将其与swig生成的<name>.py
文件放在同一目录中。
步骤五:测试调用
在python,使用import <name>
即可调用刚才生成的包(同一目录下)
import Example_swig
a = Example_swig.example()
a.say_hello()
a.change(3)
print(a.get_num())